mirror of
https://github.com/ONLYOFFICE/server.git
synced 2026-04-07 14:04:35 +08:00
Merge branch 'feature/save-copy-as' into release/v8.2.0
# Conflicts: # DocService/sources/canvasservice.js
This commit is contained in:
@ -1794,15 +1794,18 @@ exports.saveFromChanges = function(ctx, docId, statusInfo, optFormat, opt_userId
|
||||
};
|
||||
|
||||
async function processWopiSaveAs(ctx, cmd) {
|
||||
let res;
|
||||
const info = await docsCoServer.getCallback(ctx, cmd.getDocId(), cmd.getUserIndex());
|
||||
// info.wopiParams is null if it is not wopi
|
||||
if (info?.wopiParams) {
|
||||
const suggestedTargetType = `.${formatChecker.getStringFromFormat(cmd.getOutputFormat())}`;
|
||||
const suggestedExt = `.${formatChecker.getStringFromFormat(cmd.getOutputFormat())}`;
|
||||
const suggestedTarget = cmd.getSaveAsPath();
|
||||
const storageFilePath = `${cmd.getDocId()}${cmd.getSaveKey()}/${cmd.getOutputPath()}`;
|
||||
const stream = await storage.createReadStream(ctx, storageFilePath);
|
||||
const { wopiSrc, access_token } = info.wopiParams.userAuth;
|
||||
await wopiClient.putRelativeFile(ctx, wopiSrc, access_token, null, stream.readStream, stream.contentLength, suggestedTargetType, false);
|
||||
res = await wopiClient.putRelativeFile(ctx, wopiSrc, access_token, null, stream.readStream, stream.contentLength, suggestedExt, suggestedTarget, false);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
exports.receiveTask = function(data, ack) {
|
||||
return co(function* () {
|
||||
@ -1824,9 +1827,13 @@ exports.receiveTask = function(data, ack) {
|
||||
yield getOutputData(ctx, cmd, outputData, cmd.getDocId(), null, additionalOutput);
|
||||
} else if ('save' === command || 'savefromorigin' === command) {
|
||||
let status = yield getOutputData(ctx, cmd, outputData, cmd.getDocId() + cmd.getSaveKey(), null, additionalOutput);
|
||||
if (commonDefines.FileStatus.Ok === status && cmd.getIsSaveAs()) {
|
||||
yield processWopiSaveAs(ctx, cmd);
|
||||
if (commonDefines.FileStatus.Ok === status && (undefined !== cmd.getSaveAsPath() || cmd.getIsSaveAs())) {
|
||||
//todo in case of wopi no need to send url. send it to avoid stubs in sdk
|
||||
let saveAsRes = yield processWopiSaveAs(ctx, cmd);
|
||||
if (!saveAsRes) {
|
||||
outputData.setStatus('err');
|
||||
outputData.setData(constants.UNKNOWN);
|
||||
}
|
||||
}
|
||||
} else if ('sfcm' === command) {
|
||||
yield commandSfcCallback(ctx, cmd, true);
|
||||
|
||||
@ -699,10 +699,9 @@ function getConverterHtmlHandler(req, res) {
|
||||
|
||||
let metadata = yield storage.headObject(ctx, fileTo);
|
||||
let streamObj = yield storage.createReadStream(ctx, fileTo);
|
||||
let postRes = yield wopiClient.putRelativeFile(ctx, wopiSrc, access_token, null, streamObj.readStream, metadata.ContentLength, `.${targetext}`, true);
|
||||
if (postRes) {
|
||||
let fileInfo = JSON.parse(postRes.body);
|
||||
status.setUrl(fileInfo.HostEditUrl);
|
||||
let putRelativeRes = yield wopiClient.putRelativeFile(ctx, wopiSrc, access_token, null, streamObj.readStream, metadata.ContentLength, `.${targetext}`, undefined, true);
|
||||
if (putRelativeRes) {
|
||||
status.setUrl(putRelativeRes.HostEditUrl);
|
||||
status.setExtName('.' + targetext);
|
||||
} else {
|
||||
status.err = constants.UNKNOWN;
|
||||
|
||||
@ -731,9 +731,9 @@ function putFile(ctx, wopiParams, data, dataStream, dataSize, userLastChangeId,
|
||||
return postRes;
|
||||
});
|
||||
}
|
||||
function putRelativeFile(ctx, wopiSrc, access_token, data, dataStream, dataSize, suggestedTarget, isFileConversion) {
|
||||
function putRelativeFile(ctx, wopiSrc, access_token, data, dataStream, dataSize, suggestedExt, suggestedTarget, isFileConversion) {
|
||||
return co(function* () {
|
||||
let postRes = null;
|
||||
let res = undefined;
|
||||
try {
|
||||
ctx.logger.info('wopi putRelativeFile start');
|
||||
const tenCallbackRequestTimeout = ctx.getCfg('services.CoAuthoring.server.callbackRequestTimeout', cfgCallbackRequestTimeout);
|
||||
@ -741,26 +741,27 @@ function putRelativeFile(ctx, wopiSrc, access_token, data, dataStream, dataSize,
|
||||
let uri = `${wopiSrc}?access_token=${access_token}`;
|
||||
let filterStatus = yield checkIpFilter(ctx, uri);
|
||||
if (0 !== filterStatus) {
|
||||
return postRes;
|
||||
return res;
|
||||
}
|
||||
|
||||
let headers = {'X-WOPI-Override': 'PUT_RELATIVE', 'X-WOPI-SuggestedTarget': utf7.encode(suggestedTarget)};
|
||||
let headers = {'X-WOPI-Override': 'PUT_RELATIVE', 'X-WOPI-SuggestedTarget': utf7.encode(suggestedTarget || suggestedExt)};
|
||||
if (isFileConversion) {
|
||||
headers['X-WOPI-FileConversion'] = isFileConversion;
|
||||
}
|
||||
yield fillStandardHeaders(ctx, headers, uri, access_token);
|
||||
headers['Content-Type'] = mime.getType(suggestedTarget);
|
||||
headers['Content-Type'] = mime.getType(suggestedExt);
|
||||
|
||||
ctx.logger.debug('wopi putRelativeFile request uri=%s headers=%j', uri, headers);
|
||||
postRes = yield utils.postRequestPromise(ctx, uri, data, dataStream, dataSize, tenCallbackRequestTimeout, undefined, headers);
|
||||
let postRes = yield utils.postRequestPromise(ctx, uri, data, dataStream, dataSize, tenCallbackRequestTimeout, undefined, headers);
|
||||
ctx.logger.debug('wopi putRelativeFile response headers=%j', postRes.response.headers);
|
||||
ctx.logger.debug('wopi putRelativeFile response body:%s', postRes.body);
|
||||
res = JSON.parse(postRes.body);
|
||||
} catch (err) {
|
||||
ctx.logger.error('wopi error putRelativeFile:%s', err.stack);
|
||||
} finally {
|
||||
ctx.logger.info('wopi putRelativeFile end');
|
||||
}
|
||||
return postRes;
|
||||
return res;
|
||||
});
|
||||
}
|
||||
function renameFile(ctx, wopiParams, name) {
|
||||
|
||||
Reference in New Issue
Block a user