You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
parttimejob/node_modules/ali-oss/lib/common/object/copyObject.js

75 lines
2.0 KiB

1 month ago
const { checkBucketName: _checkBucketName } = require('../utils/checkBucketName');
const proto = exports;
const REPLACE_HEDERS = [
'content-type',
'content-encoding',
'content-language',
'content-disposition',
'cache-control',
'expires'
];
proto.copy = async function copy(name, sourceName, bucketName, options) {
if (typeof bucketName === 'object') {
options = bucketName; // 兼容旧版本旧版本第三个参数为options
}
options = options || {};
options.headers = options.headers || {};
Object.keys(options.headers).forEach(key => {
options.headers[`x-oss-copy-source-${key.toLowerCase()}`] = options.headers[key];
});
if (options.meta || Object.keys(options.headers).find(_ => REPLACE_HEDERS.includes(_.toLowerCase()))) {
options.headers['x-oss-metadata-directive'] = 'REPLACE';
}
this._convertMetaToHeaders(options.meta, options.headers);
sourceName = this._getSourceName(sourceName, bucketName);
if (options.versionId) {
sourceName = `${sourceName}?versionId=${options.versionId}`;
}
options.headers['x-oss-copy-source'] = sourceName;
const params = this._objectRequestParams('PUT', name, options);
params.xmlResponse = true;
params.successStatuses = [200, 304];
const result = await this.request(params);
let { data } = result;
if (data) {
data = {
etag: data.ETag,
lastModified: data.LastModified
};
}
return {
data,
res: result.res
};
};
// todo delete
proto._getSourceName = function _getSourceName(sourceName, bucketName) {
if (typeof bucketName === 'string') {
sourceName = this._objectName(sourceName);
} else if (sourceName[0] !== '/') {
bucketName = this.options.bucket;
} else {
bucketName = sourceName.replace(/\/(.+?)(\/.*)/, '$1');
sourceName = sourceName.replace(/(\/.+?\/)(.*)/, '$2');
}
_checkBucketName(bucketName);
sourceName = encodeURIComponent(sourceName);
sourceName = `/${bucketName}/${sourceName}`;
return sourceName;
};