本文介紹如何將源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());
}
}
});
相關文檔
關于拷貝文件的完整示例代碼,請參見GitHub示例。
關于拷貝文件的API接口說明,請參見CopyObject。
關于初始化OSSClient,請參見如何初始化Android端OSSClient實例。
文檔內容是否對您有幫助?