mirror of
https://github.com/ONLYOFFICE/server.git
synced 2026-04-07 14:04:35 +08:00
Merge remote-tracking branch 'remotes/origin/release/v9.1.0' into feature/linter-mysql
# Conflicts: # .github/workflows/azureStorageTests.yml # .github/workflows/s3storageTests.yml # Common/config/default.json # Common/config/log4js/development.json # Common/config/log4js/production.json # Common/sources/constants.js # Common/sources/logger.js # Common/sources/moduleReloader.js # Common/sources/operationContext.js # Common/sources/storage/storage-az.js # Common/sources/storage/storage-fs.js # Common/sources/utils.js # DocService/sources/DocsCoServer.js # DocService/sources/ai/aiProxyHandler.js # DocService/sources/canvasservice.js # DocService/sources/converterservice.js # DocService/sources/databaseConnectors/oracleConnector.js # DocService/sources/fileuploaderservice.js # DocService/sources/wopiClient.js # DocService/sources/wopiUtils.js # FileConverter/sources/converter.js
This commit is contained in:
@ -41,6 +41,7 @@ const spawnAsync = require('@expo/spawn-async');
|
||||
const bytes = require('bytes');
|
||||
const lcid = require('lcid');
|
||||
const ms = require('ms');
|
||||
const {pipeline} = require('node:stream/promises');
|
||||
|
||||
const commonDefines = require('./../../Common/sources/commondefines');
|
||||
const storage = require('./../../Common/sources/storage/storage-base');
|
||||
@ -583,25 +584,22 @@ function* processDownloadFromStorage(ctx, dataConvert, cmd, task, tempDirs, auth
|
||||
function* concatFiles(source, template) {
|
||||
template = template || 'Editor';
|
||||
//concatenate EditorN.ext parts in Editor.ext
|
||||
const list = yield utils.listObjects(source, true);
|
||||
let list = yield utils.listObjects(source, true);
|
||||
list.sort(utils.compareStringByLength);
|
||||
const writeStreams = {};
|
||||
const createdTargets = new Set();
|
||||
for (let i = 0; i < list.length; ++i) {
|
||||
const file = list[i];
|
||||
let file = list[i];
|
||||
if (file.match(new RegExp(`${template}\\d+\\.`))) {
|
||||
const target = file.replace(new RegExp(`(${template})\\d+(\\..*)`), '$1$2');
|
||||
let writeStream = writeStreams[target];
|
||||
if (!writeStream) {
|
||||
writeStream = yield utils.promiseCreateWriteStream(target);
|
||||
writeStreams[target] = writeStream;
|
||||
let target = file.replace(new RegExp(`(${template})\\d+(\\..*)`), '$1$2');
|
||||
const isFirst = !createdTargets.has(target);
|
||||
const writeOpts = isFirst ? undefined : {flags: 'a'};
|
||||
let writeStream = yield utils.promiseCreateWriteStream(target, writeOpts);
|
||||
let readStream = yield utils.promiseCreateReadStream(file);
|
||||
// Use raw pipeline for file-to-file operations to surface real errors
|
||||
yield pipeline(readStream, writeStream);
|
||||
if (isFirst) {
|
||||
createdTargets.add(target);
|
||||
}
|
||||
const readStream = yield utils.promiseCreateReadStream(file);
|
||||
yield utils.pipeStreams(readStream, writeStream, false);
|
||||
}
|
||||
}
|
||||
for (const i in writeStreams) {
|
||||
if (Object.hasOwn(writeStreams, i)) {
|
||||
writeStreams[i].end();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user