全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

高级复制文件(Java)

最近更新时间:2025-04-25 15:43:03

copyFile() 方法支持同Region的存储空间之间复制文件,用户无需关心文件大小,SDK 会自动根据文件大小进行简单复制或分块复制。

1. 支持断点续传,每块复制完成后SDK会记录到断点文件中,如果发生意外使复制中断,再次复制该文件时,会自动恢复上次的复制进度。

2. 支持复制/设置元数据、ACL、存储类型、标签等。

3. 支持进度回调。

4. 支持自动校验 CRC64。

5. 支持 KS3 托管密钥的服务端加密、用户提供密钥的服务端加密。

public void copyFile() {
    // 初始化 Ks3Client,参见“初始化”文档
    Ks3Client ks3Client = initKs3Client();

    try {
        // 初始化上传文件请求,设置 bucket,objectKey
        CopyFileRequest request = new CopyFileRequest("srcBucket", "srcObjectKey", "dstBucket", "dstObjectKey");
        // 设置分块大小
        request.setPartSize(5 * 1024 * 1024);
        // 设置并发数
        request.setTaskNum(10);
        // 设置覆盖策略
        request.setOverwritePolicy(CopyFileRequest.OverwritePolicy.NEVER);
        // 设置 metadata,可选,默认复制源文件的 metadata
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentType("text/plain");
        metadata.setUserMeta("key1", "value1");
        request.setObjectMetadata(metadata);
        // 设置访问权限,可选,默认与源文件相同
        request.setCannedAcl(CannedAccessControlList.Private);
        // 或者设置自定义权限
        AccessControlList accessControlList = new AccessControlList();
        accessControlList.addGrant(new GranteeId("id1"), Permission.Read);
        accessControlList.addGrant(new GranteeId("id2"), Permission.Write);
        request.setAccessControlList(accessControlList);
        // 设置存储类型,可选,默认与源文件相同
        request.setStorageClass(StorageClass.Standard);
        // 设置标签,可选,默认与源文件相同
        ObjectTagging objectTagging = new ObjectTagging();
        objectTagging.addObjectTag("key1", "value1");
        objectTagging.addObjectTag("key2", "value2");
        request.setObjectTagging(objectTagging);
        // 设置复制源文件的元数据,true:复制源文件的元数据,忽略本次设置的 metadata,false:不复制源文件的元数据,默认为 true
        request.setCopySrcMetadata(true);
        // 设置复制源文件的标签,true:复制源文件的标签,忽略本次设置的标签,false:不复制源文件的标签,默认为 true
        request.setCopySrcTagging(true);
        // 设置断点续传开关,默认关闭
        request.setEnableCheckpoint(true);
        // 设置断点续传文件地址,默认为:<uploadFilePath>.ucp
        request.setCheckpointFile("/data/test-file.ucp");
        // 如果源文件是客户提供密钥的服务端加密的,则需要设置客户的密钥
        // request.setSrcSseCustomerKey(srcCustomerKey);
        // 如果目标文件需要使用客户提供密钥的服务端加密,则需要设置客户的密钥
        // request.setDstSseCustomerKey(dstCustomerKey);
        // 设置进度回调,可选
        ProgressListener listener = new ProgressListener() {
            @Override
            public void progressChanged(ProgressEvent progressEvent) {
                System.out.println("Event Type: " + progressEvent.getEventType());
                System.out.println("Event Bytes: " + progressEvent.getBytes());
            }
        };
        request.setProgressListener(listener);
        // 启用 CRC64 校验
        ks3Client.getKs3config().setCrcCheckEnabled(true);
        // 开始复制文件
        CopyFileResult result = ks3Client.copyFile(request);
        System.out.println("ETag: " + result.getETag());
        System.out.println("Crc64Ecma: " + result.getCrc64Ecma());
    } catch (Ks3ServiceException e) {
        System.out.println("Ks3ServiceException occurred, which means the request was made to KS3, but KS3 returned an error response for some reason.");
        System.out.println("Error Message: " + e.getErrorMessage());
        System.out.println("Error Code: " + e.getErrorCode());
        System.out.println("Request ID: " + e.getRequestId());
    } catch (Ks3ClientException e) {
        System.out.println("Ks3ClientException occurred, which means the client encountered an internal error while trying to communicate with KS3.");
        System.out.println("Error Message: " + e.getMessage());
    } catch (Throwable t) {
        System.out.println("Throwable occurred: " + t.getMessage());
    } finally {
        // 不再使用时,关闭 Ks3Client
        ks3Client.shutdown();
    }
}

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈