Harmony拷贝文件

本文介绍如何在受版本控制的存储空间(Bucket)中拷贝文件(Object)。

权限说明

阿里云账号默认拥有全部权限。阿里云账号下的RAM用户或RAM角色默认没有任何权限,需要阿里云账号或账号管理员通过RAM PolicyBucket Policy授予操作权限。

API

Action

说明

CopyObject

oss:GetObject

拷贝同一地域下相同或不同存储空间(Bucket)之间的文件(Object)。

oss:PutObject

oss:GetObjectVersion

如果通过versionId指定拷贝的源Object版本,还需要此操作的权限。

oss:GetObjectTagging

如果通过x-oss-tagging拷贝Object的标签,则需要此操作的权限。

oss:PutObjectTagging

oss:GetObjectVersionTagging

如果通过versionId指定拷贝的源Object特定版本的Object的标签,还需要此操作的权限。

kms:GenerateDataKey

拷贝Object时,如果目标Object的元数据包含X-Oss-Server-Side-Encryption: KMS,则需要这两个权限。

kms:Decrypt

拷贝小文件

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

一个存储空间(目标存储空间)。

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

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

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

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

import Client, { RequestError } from '@aliyun/oss';

// 创建OSS客户端实例
const client = new Client({
  // 请替换为STS临时身份凭证的Access Key ID
  accessKeyId: 'yourAccessKeyId',
  // 请替换为STS临时身份凭证的Access Key Secret
  accessKeySecret: 'yourAccessKeySecret',
  // 请替换为STS临时身份凭证的Security Token
  securityToken: 'yourSecurityToken',
  // 填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou
  region: 'oss-cn-hangzhou',
});

// 根据版本ID复制对象
const copyObjectByVersionId = async () => {
  try {
    // 调用copyObject方法,根据指定的版本ID复制对象
    const res = await client.copyObject({
      bucket: 'targetBucket', // 目标存储桶名称
      key: 'targetKey', // 目标对象名称
      copySourceKey: 'sourceKey', // 源对象名称
      copySourceVersionId: 'sourceVersionId', // 源对象的版本ID
      // copySourceBucket:'sourceBucket', // (可选)配置copySourceBucket,不配置默认该值为bucket的值
    });

    // 打印返回结果,包含复制操作的响应信息
    console.log(JSON.stringify(res));
  } catch (err) {
    // 捕获并处理请求错误
    if (err instanceof RequestError) {
      console.log('错误码: ', err.code); // 错误代码,例如"NoSuchKey"表示对象不存在
      console.log('错误信息: ', err.message); // 错误描述,提供更详细的错误信息
      console.log('请求ID: ', err.requestId); // 请求的唯一标识,用于排查问题
      console.log('HTTP状态码: ', err.status); // HTTP响应状态码,例如404表示资源未找到
      console.log('错误类别: ', err.ec); // 错误类别,进一步分类错误类型
    } else {
      console.log('未知错误: ', err); // 非RequestError类型的错误,可能是其他异常
    }
  }
};

// 调用函数,执行基于版本ID的对象复制操作
copyObjectByVersionId();

相关文档

  • 关于拷贝小文件的更多信息,请参见CopyObject