全部產品
Search
文件中心

:拷貝檔案

更新時間:Oct 19, 2018

拷貝小檔案

對於小於1GB的檔案,您可以通過ossClient.copyObject方法將檔案從一個儲存空間(源儲存空間)複製到同一地域的另一個儲存空間(目標儲存空間)。此方法有兩種參數指定方式:

參數指定方式 描述
CopyObjectResult copyObject(String sourceBucketName, String sourceKey, String destinationBucketName, String destinationKey) 允許指定源儲存空間和源檔案,以及目標儲存空間和目標檔案。拷貝後,目標檔案的內容及元資訊與源檔案相同,稱為簡單拷貝。
CopyObjectResult copyObject(CopyObjectRequest copyObjectRequest) 允許指定目標檔案的元資訊和拷貝的限制條件。如果拷貝操作的源檔案地址和目標檔案地址相同,則直接替換源檔案的元資訊。

CopyObjectRequest可設定的參數如下:

參數 描述 方法
sourceBucketName 源儲存空間名稱。 setSourceBucketName(String sourceBucketName)
sourceKey 源檔案名稱。 setSourceKey(String sourceKey)
destinationBucketName 目標儲存空間名稱。 setDestinationBucketName(String destinationBucketName)
destinationKey 目標檔案名稱。 setDestinationKey(String destinationKey)
newObjectMetadata 目標檔案元資訊。 setNewObjectMetadata(ObjectMetadata newObjectMetadata)
matchingETagConstraints 拷貝的限制條件。如果源檔案的ETag值和提供的ETag值相等,則執行拷貝操作,否則返回錯誤。 setMatchingETagConstraints(List<String> matchingETagConstraints)
nonmatchingEtagConstraints 拷貝的限制條件。如果源檔案的ETag值和使用者提供的ETag值不相等,則執行拷貝操作,否則返回錯誤。 setNonmatchingETagConstraints(List<String> nonmatchingEtagConstraints)
unmodifiedSinceConstraint 拷貝的限制條件。如果傳入參數中的時間等於或者晚於檔案實際修改時間,則執行拷貝操作,否則返回錯誤。 setUnmodifiedSinceConstraint(Date unmodifiedSinceConstraint)
modifiedSinceConstraint 拷貝的限制條件。如果源檔案在指定的時間之後被修改過,則執行拷貝操作,否則返回錯誤。 setModifiedSinceConstraint(Date modifiedSinceConstraint)

CopyObjectRequest的參數如下:

參數 描述 方法
etag OSS檔案唯一性標誌 String getETag()
lastModified 檔案最後修改時間 Date getLastModified()

此操作的限制條件如下:

  • 使用者有源檔案的讀寫權限。
  • 不支援跨地域拷貝。例如,不支援將杭州儲存空間裡的檔案拷貝到青島。
  • 檔案的大小不能超過1GB。

簡單拷貝

以下代碼用於簡單拷貝:

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String sourceBucketName = "<yourSourceBucketName>";
  7. String sourceObjectName = "<yourSourceObjectName>";
  8. String destinationBucketName = "<yourDestinationBucketName>";
  9. String destinationObjectName = "<yourDestinationObjectName>";
  10. // 建立OSSClient執行個體。
  11. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  12. // 拷貝檔案。
  13. CopyObjectResult result = ossClient.copyObject(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
  14. System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
  15. // 關閉OSSClient。
  16. ossClient.shutdown();

通過CopyObjectRequest拷貝

以下代碼用於通過CopyObjectRequest拷貝檔案:

  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String sourceBucketName = "<yourSourceBucketName>";
  7. String sourceObjectName = "<yourSourceObjectName>";
  8. String destinationBucketName = "<yourDestinationBucketName>";
  9. String destinationObjectName = "<yourDestinationObjectName>";
  10. // 建立OSSClient執行個體。
  11. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
  12. // 建立CopyObjectRequest對象。
  13. CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
  14. // 設定新的檔案元資訊。
  15. ObjectMetadata meta = new ObjectMetadata();
  16. meta.setContentType("text/html");
  17. copyObjectRequest.setNewObjectMetadata(meta);
  18. // 複製檔案。
  19. CopyObjectResult result = ossClient.copyObject(copyObjectRequest);
  20. System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
  21. // 關閉OSSClient。
  22. ossClient.shutdown();

拷貝大檔案

對於大於1GB的檔案,需要使用分區拷貝(UploadPartCopy)。分區拷貝分為三步:

  1. 通過ossClient.initiateMultipartUpload初始化分區拷貝任務。
  2. 通過ossClient.uploadPartCopy進行分區拷貝。除最後一個分區外,其它分區都要大於100KB。
  3. 通過ossClient.completeMultipartUpload提交分區拷貝任務。
  1. // Endpoint以杭州為例,其它Region請按實際情況填寫。
  2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  3. // 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
  4. String accessKeyId = "<yourAccessKeyId>";
  5. String accessKeySecret = "<yourAccessKeySecret>";
  6. String sourceBucketName = "<yourSourceBucketName>";
  7. String sourceObjectName = "<yourSourceObjectName>";
  8. String destinationBucketName = "<yourDestinationBucketName>";
  9. String destinationObjectName = "<yourDestinationObjectName>";
  10. ObjectMetadata objectMetadata = ossClient.getObjectMetadata(sourceBucketName, sourceObjectName);
  11. // 獲取被拷貝檔案的大小。
  12. long contentLength = objectMetadata.getContentLength();
  13. // 設定分區大小為10MB。
  14. long partSize = 1024 * 1024 * 10;
  15. // 計算分區總數。
  16. int partCount = (int) (contentLength / partSize);
  17. if (contentLength % partSize != 0) {
  18. partCount++;
  19. }
  20. System.out.println("total part count:" + partCount);
  21. // 初始化拷貝任務。可以通過InitiateMultipartUploadRequest指定目標檔案元資訊。
  22. InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(destinationBucketName, destinationObjectName);
  23. InitiateMultipartUploadResult initiateMultipartUploadResult = ossClient.initiateMultipartUpload(initiateMultipartUploadRequest);
  24. String uploadId = initiateMultipartUploadResult.getUploadId();
  25. // 分區拷貝。
  26. List<PartETag> partETags = new ArrayList<PartETag>();
  27. for (int i = 0; i < partCount; i++) {
  28. // 計算每個分區的大小。
  29. long skipBytes = partSize * i;
  30. long size = partSize < contentLength - skipBytes ? partSize : contentLength - skipBytes;
  31. // 建立UploadPartCopyRequest。可以通過UploadPartCopyRequest指定限定條件。
  32. UploadPartCopyRequest uploadPartCopyRequest =
  33. new UploadPartCopyRequest(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
  34. uploadPartCopyRequest.setUploadId(uploadId);
  35. uploadPartCopyRequest.setPartSize(size);
  36. uploadPartCopyRequest.setBeginIndex(skipBytes);
  37. uploadPartCopyRequest.setPartNumber(i + 1);
  38. UploadPartCopyResult uploadPartCopyResult = ossClient.uploadPartCopy(uploadPartCopyRequest);
  39. // 將返回的分區ETag保存到partETags中。
  40. partETags.add(uploadPartCopyResult.getPartETag());
  41. }
  42. // 提交分區拷貝任務。
  43. CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(
  44. destinationBucketName, destinationObjectName, uploadId, partETags);
  45. ossClient.completeMultipartUpload(completeMultipartUploadRequest);
  46. // 關閉OSSClient。
  47. ossClient.shutdown();

分區拷貝的詳細說明請參見UploadPartCopy。分區拷貝的完整代碼請參見GitHub