|
|
|
|
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;
|
|
|
|
|
};
|