本文介绍如何将源Bucket中的文件(Object)复制到同一地域下相同或不同目标Bucket中。

注意事项

  • 拷贝文件时,您必须拥有源文件的读权限及目标Bucket的读写权限。
  • 不支持跨地域拷贝。例如不能将华东1(杭州)地域存储空间中的文件拷贝到华北1(青岛)地域。
  • 拷贝的文件大小不能超过1 GB。

示例代码

以下代码用于拷贝文件:

// 填写源Bucket名称。
String srcBucketName = "srcbucket";
// 填写源Bucket内的Object完整路径。
String srcObjectKey = "dir1/srcobject.txt";
// 填写与源Bucket处于同一地域的目标Bucket名称。
String destBucketName = "destbucket";
// 填写目标Bucket内的Object完整路径。
String destObjectKey = "dir2/destobject.txt";
// 创建Copy请求。
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcObjectKey, destBucketName, destObjectKey);

// ObjectMetadata objectMetadata = new ObjectMetadata();
// 设置Object的访问权限。此处设置有private,表示私有访问权限。
// objectMetadata.setHeader("x-oss-object-acl", "private");
// 设置Object存储类型。此处设置为Standard,表示标准存储类型。
// objectMetadata.setHeader("x-oss-storage-class", "Standard");
// 指定CopyObject操作时是否覆盖同名目标Object。此处设置为true,表示禁止覆盖同名Object。
// objectMetadata.setHeader("x-oss-forbid-overwrite", "true");
// 如果源Object的ETag值和您提供的ETag相等,则执行拷贝操作。
// objectMetadata.setHeader("x-oss-copy-source-if-match", "5B3C1A2E053D763E1B002CC607C5****");
// 指定拷贝的源地址。
// objectMetadata.setHeader("x-oss-copy-source", "/examplebucket/recode-test.txt");
// 如果源Object的ETag值和您提供的ETag不相等,则执行拷贝操作。
// objectMetadata.setHeader("x-oss-copy-source-if-none-match", "5B3C1A2E053D763E1B002CC607C5****");
// 如果指定的时间等于或者晚于文件实际修改时间,则执行拷贝操作。
// objectMetadata.setHeader("x-oss-copy-source-if-unmodified-since", "2021-12-09T07:01:56.000Z");
// 如果源Object在指定时间后被修改过,则执行拷贝操作。
// objectMetadata.setHeader("x-oss-copy-source-if-modified-since", "2021-12-09T07:01:56.000Z");
// 指定设置目标Object元信息的方式。此处设置为COPY,表示复制源Object的元数据到目标Object。
// objectMetadata.setHeader("x-oss-metadata-directive", "COPY");
// 指定OSS创建目标Object时使用的服务器端加密算法。
// objectMetadata.setHeader("x-oss-server-side-encryption", "SSE-KMS");
// 表示KMS托管的用户主密钥,该参数仅在x-oss-server-side-encryption为KMS时有效。
// objectMetadata.setHeader("x-oss-server-side-encryption-key-id", "9468da86-3509-4f8d-a61e-6eab1eac****");
// 指定Object的对象标签,可同时设置多个标签。
// objectMetadata.setHeader("x-oss-tagging", "a:1");
// 指定设置目标Object对象标签的方式。此处设置为COPY,表示复制源Object的对象标签到目标Object。
// objectMetadata.setHeader("x-oss-tagging-directive", "COPY");

// 异步Copy。
OSSAsyncTask copyTask = oss.asyncCopyObject(copyObjectRequest, new OSSCompletedCallback<CopyObjectRequest, CopyObjectResult>() {
    @Override
    public void onSuccess(CopyObjectRequest request, CopyObjectResult result) {
        Log.d("copyObject", "copy success!");
    }

    @Override
    public void onFailure(CopyObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
        // 请求异常。
        if (clientExcepion != null) {
            // 客户端异常,例如网络异常等。
            clientExcepion.printStackTrace();
        }
        if (serviceException != null) {
            // 服务端异常。
            Log.e("ErrorCode", serviceException.getErrorCode());
            Log.e("RequestId", serviceException.getRequestId());
            Log.e("HostId", serviceException.getHostId());
            Log.e("RawMessage", serviceException.getRawMessage());
        }
    }
});

相关文档

  • 关于拷贝文件的完整示例代码,请参见GitHub示例
  • 关于拷贝文件的API接口说明,请参见CopyObject