拷貝小檔案
對於小於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。
簡單拷貝
以下代碼用於簡單拷貝:
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String sourceBucketName = "<yourSourceBucketName>";
String sourceObjectName = "<yourSourceObjectName>";
String destinationBucketName = "<yourDestinationBucketName>";
String destinationObjectName = "<yourDestinationObjectName>";
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 拷貝檔案。
CopyObjectResult result = ossClient.copyObject(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
// 關閉OSSClient。
ossClient.shutdown();
通過CopyObjectRequest拷貝
以下代碼用於通過CopyObjectRequest拷貝檔案:
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String sourceBucketName = "<yourSourceBucketName>";
String sourceObjectName = "<yourSourceObjectName>";
String destinationBucketName = "<yourDestinationBucketName>";
String destinationObjectName = "<yourDestinationObjectName>";
// 建立OSSClient執行個體。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 建立CopyObjectRequest對象。
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
// 設定新的檔案元資訊。
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType("text/html");
copyObjectRequest.setNewObjectMetadata(meta);
// 複製檔案。
CopyObjectResult result = ossClient.copyObject(copyObjectRequest);
System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
// 關閉OSSClient。
ossClient.shutdown();
拷貝大檔案
對於大於1GB的檔案,需要使用分區拷貝(UploadPartCopy)。分區拷貝分為三步:
- 通過ossClient.initiateMultipartUpload初始化分區拷貝任務。
- 通過ossClient.uploadPartCopy進行分區拷貝。除最後一個分區外,其它分區都要大於100KB。
- 通過ossClient.completeMultipartUpload提交分區拷貝任務。
// Endpoint以杭州為例,其它Region請按實際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里雲主帳號AccessKey擁有所有API的存取權限,風險很高。強烈建議您建立並使用RAM帳號進行API訪問或日常運維,請登入 https://ram.console.aliyun.com 建立RAM帳號。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
String sourceBucketName = "<yourSourceBucketName>";
String sourceObjectName = "<yourSourceObjectName>";
String destinationBucketName = "<yourDestinationBucketName>";
String destinationObjectName = "<yourDestinationObjectName>";
ObjectMetadata objectMetadata = ossClient.getObjectMetadata(sourceBucketName, sourceObjectName);
// 獲取被拷貝檔案的大小。
long contentLength = objectMetadata.getContentLength();
// 設定分區大小為10MB。
long partSize = 1024 * 1024 * 10;
// 計算分區總數。
int partCount = (int) (contentLength / partSize);
if (contentLength % partSize != 0) {
partCount++;
}
System.out.println("total part count:" + partCount);
// 初始化拷貝任務。可以通過InitiateMultipartUploadRequest指定目標檔案元資訊。
InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(destinationBucketName, destinationObjectName);
InitiateMultipartUploadResult initiateMultipartUploadResult = ossClient.initiateMultipartUpload(initiateMultipartUploadRequest);
String uploadId = initiateMultipartUploadResult.getUploadId();
// 分區拷貝。
List<PartETag> partETags = new ArrayList<PartETag>();
for (int i = 0; i < partCount; i++) {
// 計算每個分區的大小。
long skipBytes = partSize * i;
long size = partSize < contentLength - skipBytes ? partSize : contentLength - skipBytes;
// 建立UploadPartCopyRequest。可以通過UploadPartCopyRequest指定限定條件。
UploadPartCopyRequest uploadPartCopyRequest =
new UploadPartCopyRequest(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);
uploadPartCopyRequest.setUploadId(uploadId);
uploadPartCopyRequest.setPartSize(size);
uploadPartCopyRequest.setBeginIndex(skipBytes);
uploadPartCopyRequest.setPartNumber(i + 1);
UploadPartCopyResult uploadPartCopyResult = ossClient.uploadPartCopy(uploadPartCopyRequest);
// 將返回的分區ETag保存到partETags中。
partETags.add(uploadPartCopyResult.getPartETag());
}
// 提交分區拷貝任務。
CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(
destinationBucketName, destinationObjectName, uploadId, partETags);
ossClient.completeMultipartUpload(completeMultipartUploadRequest);
// 關閉OSSClient。
ossClient.shutdown();
分區拷貝的詳細說明請參見UploadPartCopy。分區拷貝的完整代碼請參見GitHub。