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