全部產品
Search
文件中心

Object Storage Service:Android拷貝檔案

更新時間:Feb 28, 2024

本文介紹如何將源Bucket中的檔案(Object)複製到同一地區下相同或不同目標Bucket中。

注意事項

  • 拷貝檔案時,您必須擁有源檔案的讀許可權及目標Bucket的讀寫權限。

  • 不支援跨地區拷貝。例如不能將華東1(杭州)地區儲存空間中的檔案拷貝到華北1(青島)地區。

  • 拷貝的檔案大小不能超過1 GB。

  • 使用本文樣本前您需要先通過自訂網域名、STS等方式建立OSSClient,具體請參見如何初始化Android端OSSClient執行個體

範例程式碼

以下代碼用於拷貝檔案:

// 填寫源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());
        }
    }
});

相關文檔