本文介绍如何将源Bucket中的文件(Object)复制到同一地域下相同或不同目标Bucket中。
注意事项
使用本文示例前您需要先通过自定义域名、STS等方式新建OSSClient,具体请参见初始化。
拷贝文件时,您必须拥有源文件的读权限及目标Bucket的读写权限。
不支持跨地域拷贝。例如不能将华东1(杭州)地域存储空间中的文件拷贝到华北1(青岛)地域。
拷贝的文件大小不能超过1 GB。
示例代码
以下代码用于拷贝文件:
OSSCopyObjectRequest * copy = [OSSCopyObjectRequest new];
// 填写源Bucket名称。
copy.sourceBucketName = @"sourcebucket";
// 填写源Bucket内的Object完整路径。
copy.sourceObjectKey = @"dir1/srcobject.txt";
// 填写目标Bucket名称。
copy.bucketName = @"destbucket";
// 填写目标Bucket内的Object完整路径。
copy.objectKey = @"dir2/destobject.txt";
NSMutableDictionary *objectMeta = [NSMutableDictionary dictionary];
// 设置访问权限。此处设置为private,表示私有权限。
[objectMeta setValue:@"x-oss-object-acl" forKey:@"public-read"];
// 设置存储类型。此处设置为Standard,表示标准存储类型。
[objectMeta setValue:@"x-oss-storage-class" forKey:@"Standard"];
// 是否覆盖同名Object。不指定x-oss-forbid-overwrite时,默认覆盖同名Object。
// 指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在,程序将报错。
[objectMeta setValue:@"x-oss-forbid-overwrite" forKey:@"true"];
// 如果源Object的ETag值和您提供的ETag相等,则执行拷贝操作。
[objectMeta setValue:@"x-oss-copy-source-if-match" forKey:@"5B3C1A2E053D763E1B002CC607C5****"];
// 如果源Object的ETag值和您提供的ETag不相等,则执行拷贝操作。
[objectMeta setValue:@"x-oss-copy-source-if-none-match" forKey:@"5B3C1A2E053D763E1B002CC607C5****"];
// 如果文件实际修改时间早于或等于2021-12-09T07:01:56.000Z,则执行拷贝操作。
[objectMeta setValue:@"x-oss-copy-source-if-unmodified-since" forKey:@"2021-12-09T07:01:56.000Z"];
// 如果文件实际修改时间晚于2021-12-15T07:01:56.000Z,则执行拷贝操作。
[objectMeta setValue:@"x-oss-copy-source-if-modified-since" forKey:@"2021-12-15T07:01:56.000Z"];
// 复制源Object的元数据到目标Object。
[objectMeta setValue:@"x-oss-metadata-directive" forKey:@"COPY"];
// 复制源Object的对象标签到目标Object。
[objectMeta setValue:@"x-oss-tagging-directive" forKey:@"Copy"];
// 指定OSS创建目标Object时使用的服务器端加密算法。
[objectMeta setValue:@"x-oss-server-side-encryption" forKey:@"KMS"];
// 表示KMS托管的用户主密钥,该参数仅在x-oss-server-side-encryption为KMS时有效。
[objectMeta setValue:@"x-oss-server-side-encryption-key-id" forKey:@"9468da86-3509-4f8d-a61e-6eab1eac****"];
copy.objectMeta = objectMeta;
OSSTask * task = [client copyObject:copy];
[task continueWithBlock:^id(OSSTask *task) {
if (!task.error) {
NSLog(@"copy object success!");
} else {
NSLog(@"copy object failed, error: %@" , task.error);
}
return nil;
}];
// 实现同步阻塞等待任务完成。
// [task waitUntilFinished];
相关文档
关于拷贝文件的API接口说明,请参见CopyObject。