租房小程序前端代码
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.

74 lines
2.0 KiB

3 months ago
  1. const { checkBucketName: _checkBucketName } = require('../utils/checkBucketName');
  2. const proto = exports;
  3. const REPLACE_HEDERS = [
  4. 'content-type',
  5. 'content-encoding',
  6. 'content-language',
  7. 'content-disposition',
  8. 'cache-control',
  9. 'expires'
  10. ];
  11. proto.copy = async function copy(name, sourceName, bucketName, options) {
  12. if (typeof bucketName === 'object') {
  13. options = bucketName; // 兼容旧版本,旧版本第三个参数为options
  14. }
  15. options = options || {};
  16. options.headers = options.headers || {};
  17. Object.keys(options.headers).forEach(key => {
  18. options.headers[`x-oss-copy-source-${key.toLowerCase()}`] = options.headers[key];
  19. });
  20. if (options.meta || Object.keys(options.headers).find(_ => REPLACE_HEDERS.includes(_.toLowerCase()))) {
  21. options.headers['x-oss-metadata-directive'] = 'REPLACE';
  22. }
  23. this._convertMetaToHeaders(options.meta, options.headers);
  24. sourceName = this._getSourceName(sourceName, bucketName);
  25. if (options.versionId) {
  26. sourceName = `${sourceName}?versionId=${options.versionId}`;
  27. }
  28. options.headers['x-oss-copy-source'] = sourceName;
  29. const params = this._objectRequestParams('PUT', name, options);
  30. params.xmlResponse = true;
  31. params.successStatuses = [200, 304];
  32. const result = await this.request(params);
  33. let { data } = result;
  34. if (data) {
  35. data = {
  36. etag: data.ETag,
  37. lastModified: data.LastModified
  38. };
  39. }
  40. return {
  41. data,
  42. res: result.res
  43. };
  44. };
  45. // todo delete
  46. proto._getSourceName = function _getSourceName(sourceName, bucketName) {
  47. if (typeof bucketName === 'string') {
  48. sourceName = this._objectName(sourceName);
  49. } else if (sourceName[0] !== '/') {
  50. bucketName = this.options.bucket;
  51. } else {
  52. bucketName = sourceName.replace(/\/(.+?)(\/.*)/, '$1');
  53. sourceName = sourceName.replace(/(\/.+?\/)(.*)/, '$2');
  54. }
  55. _checkBucketName(bucketName);
  56. sourceName = encodeURIComponent(sourceName);
  57. sourceName = `/${bucketName}/${sourceName}`;
  58. return sourceName;
  59. };