mirror of https://github.com/jkjoy/sunpeiwen.git
75 lines
2.0 KiB
JavaScript
75 lines
2.0 KiB
JavaScript
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;
|
||
};
|