Node.js拷贝文件

本文介绍如何在受版本控制的存储空间(Bucket)中拷贝文件(Object)。您可以通过CopyObject的方法拷贝小于1 GB的文件,通过分片拷贝(UploadPartCopy)的方法拷贝大于1 GB的文件。

拷贝小文件

对于小于1 GB的文件,您可以通过CopyObject方法将文件从一个存储空间(源存储空间)复制到同一地域的另一个存储空间(目标存储空间)。

  • x-oss-copy-source默认拷贝Object的当前版本。如果当前版本是删除标记,则返回404表示该Object不存在。您可以在x-oss-copy-source中加入versionId来拷贝指定的Object版本,删除标记不能被拷贝。

  • 您可以将Object的早期版本拷贝到同一个Bucket中,拷贝Object的历史版本将会成为一个新的当前版本,达到恢复Object早期版本的目的。

  • 如果目标Bucket已开启版本控制,OSS将会为新拷贝出来的Object自动生成唯一的版本ID,此版本ID将会在响应header 的x-oss-version-id中返回。如果目标Bucket未曾开启或者暂停了版本控制,OSS将会为新拷贝的Object自动生成version ID为”null“的版本,且会覆盖原先versionId为”null“的版本。

  • 目标Bucket在开启或暂停版本控制状态下,不支持对Appendable类型Object执行拷贝操作。

以下代码用于拷贝小文件:

const OSS = require('ali-oss');

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'yourregion',
  // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // yourbucketname填写存储空间名称。
  bucket: 'yourbucketname'
});

// 指定拷贝源Object的versionId。
const versionId = 'versionId';
// 指定拷贝源Object。
const srcObject = 'srcObject.txt';
// 指定拷贝源Bucket。
const srcBucket = 'srcBucket;
// 指定拷贝目标Object。
const targetObject = 'targetObject.txt';
async function Copy() {
  try {
    const result = await client.copy(targetObject, srcObject, srcBucket, {
      meta: {
        versionId: versionId
      }
    });

    console.log(result);
  } catch (error) {
    console.error(error);
  }
}

Copy()

拷贝大文件

对于大于1 GB的文件,需要使用分片拷贝(multipartUploadCopy)的方法。

分片拷贝默认从一个已存在的Object的当前版本中拷贝数据来上传一个Part。允许通过在请求header : x-oss-copy-source中附带versionId的子条件,实现从Object的指定版本进行拷贝,如x-oss-copy-source : /SourceBucketName/SourceObjectName?versionId=111111。

说明

SourceObjectName要进行URL编码。响应中将会返回被拷贝的Object版本ID: x-oss-copy-source-version-id。

如果未指定versionId且拷贝Object的当前版本为删除标记,OSS将返回404 Not Found。通过指定versionId来拷贝删除标记时,OSS将返回400 Bad Request。

以下代码用于分片拷贝:

const OSS = require('ali-oss');

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
  region: 'yourregion',
  // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  accessKeyId: process.env.OSS_ACCESS_KEY_ID,
  accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
  authorizationV4: true,
  // yourbucketname填写存储空间名称。
  bucket: 'yourbucketname'
});

// 指定拷贝源Object的versionId。
const versionId = 'versionId';
// 指定拷贝源Object。
const srcObject = "srcObject.txt";
// 指定拷贝源Bucket。
const srcBucket = 'srcBucket';
// 指定拷贝目标Object。
const targetObject = "targetObject.txt";

async function multipartUploadCopy() {
  const result = await client.multipartUploadCopy(
    targetObject,
    {
      sourceKey: srcObject,
      sourceBucketName: srcBucket,
    },
    {
      versionId
    }
  );
  console.log(result);
}

multipartUploadCopy();

相关文档

  • 关于拷贝小文件的API接口说明,请参见CopyObject

  • 关于拷贝大文件的API接口说明,请参见UploadPartCopy