本文介绍如何在受版本控制的存储空间(Bucket)中拷贝文件(Object)。
权限说明
阿里云账号默认拥有全部权限。阿里云账号下的RAM用户或RAM角色默认没有任何权限,需要阿里云账号或账号管理员通过RAM Policy或Bucket Policy授予操作权限。
API | Action | 说明 |
CopyObject |
| 拷贝同一地域下相同或不同存储空间(Bucket)之间的文件(Object)。 |
| ||
| 如果通过versionId指定拷贝的源Object版本,还需要此操作的权限。 | |
| 如果通过x-oss-tagging拷贝Object的标签,则需要此操作的权限。 | |
| ||
| 如果通过versionId指定拷贝的源Object特定版本的Object的标签,还需要此操作的权限。 | |
| 拷贝Object时,如果目标Object的元数据包含X-Oss-Server-Side-Encryption: KMS,则需要这两个权限。 | |
|
拷贝小文件
对于小于1 GB的文件,您可以通过CopyObject方法将文件从一个存储空间(源存储空间)复制到同一地域的另
一个存储空间(目标存储空间)。
x-oss-copy-source默认拷贝Object的当前版本。如果当前版本是删除标记,则返回404表示该Object不存在。您可以使用copySourceVersionId来拷贝指定的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执行拷贝操作;当目标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。