融合接口
功能說明
分(fen)片(pian)上傳步驟較多,包括初始化(hua)、文件(jian)切(qie)片(pian)、各個分(fen)片(pian)上傳、完(wan)成上傳。為(wei)了簡化(hua)分(fen)片(pian)上傳,Java SDK 提供了分(fen)片(pian)上傳的(de)(de)封(feng)裝接口(kou)(kou)。您可(ke)以調用(yong) TransferManager 接口(kou)(kou),快(kuai)速(su)實(shi)現文件(jian)的(de)(de)分(fen)片(pian)上傳與分(fen)片(pian)的(de)(de)管(guan)理。文件(jian)的(de)(de)上傳時,TransferManager 會采用(yong)多線程(cheng)的(de)(de)方(fang)式,同時進行多個文件(jian)的(de)(de)上傳。
代碼示例
使用 TransferManager 分片上傳
public void upload() {
try {
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
String localPath = "<your-local-path>";
?
// TransferManager 只需要初始化一次,可以用于多個上傳任務
TransferManager transMgr = TransferManagerBuilder.standard()
.withS3Client(s3Client)
// 設置最小分片大小,默認是5MB。
.withMinimumUploadPartSize(10*1024*1024L)
// 設置采用分片上傳的閾值為100MB。只有當文件大于該值時,才會采用分片上傳,否則采用普通上傳。默認值是16MB。
.withMultipartUploadThreshold(100*1024*1024L)
.build();
?
// TransferManager 采用異步方式進行處理,因此該調用會立即返回。
PutObjectRequest request = new PutObjectRequest(bucket, key, new File(localPath));
request.withCannedAcl(CannedAccessControlList.Private); // 設置對象ACL,可以設置公共讀CannedAccessControlList.PublicRead
// request.setStorageClass(StorageClass.Standard); // 設置對象的存儲類別
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType("application/octet-stream"); // 設置Content-Type,默認application/octet-stream
request.setMetadata(meta); // 還可以設置其他自定義元數據
?
Upload upload = transMgr.upload(request);
// 等待上傳全部完成。
UploadResult result = upload.waitForUploadResult();
System.out.println("upload success, etag=" + result.getETag());
} catch (InterruptedException e) {
e.printStackTrace();
}
}使用 TransferManager 分片復制(zhi)
public void copy() {
try {
String destBucketName = "<your-bucket-name>";
String destObjectKey = "<your-object-key>";
String sourceBucketName = "<source-bucket-name>";
String sourceObjectKey = "<source-object-key>";
?
// TransferManager 只需要初始化一次,可以用于多個上傳任務
TransferManager transMgr = TransferManagerBuilder.standard()
.withS3Client(s3Client)
.withMinimumUploadPartSize(10*1024*1024L)
.withMultipartUploadThreshold(100*1024*1024L)
.build();
?
// TransferManager 采用異步方式進行處理,因此該調用會立即返回。
CopyObjectRequest request = new CopyObjectRequest(sourceBucketName, sourceObjectKey, destBucketName, destObjectKey);
Copy copy = transMgr.copy(request);
CopyResult result = copy.waitForCopyResult();
System.out.println("copy success, etag=" + result.getETag());
} catch (InterruptedException e) {
e.printStackTrace();
}
}取消分片上傳
您可(ke)以使用 TransferManager.abortMultipartUploads 來取(qu)消(xiao)分片(pian)上(shang)傳。
public void abortMultipartUploads() {
String bucket = "<your-bucket-name>";
int sevenDays = 1000 * 60 * 60 * 24 * 7;
Date oneWeekAgo = new Date(System.currentTimeMillis() - sevenDays);
TransferManager transMgr = TransferManagerBuilder.standard()
.withS3Client(s3Client)
.build();
//取消在一個星期前初始化并還未完成的分片上傳
transMgr.abortMultipartUploads(bucket, oneWeekAgo);
}關于Content-Type的說明
Content-Type用于標識文件的資源類型,比如image/png, image/jpg 是圖片類型,video/mpeg, video/mp4是視頻類型,text/plain, text/html是文本類型, 瀏覽器針對不同的Content-Type會有不同的操作,比如圖片類型可以預覽,視頻類型可以播放,文本類型可以直接打開。application/octet-stream類型(xing)會(hui)直接打開(kai)下載窗(chuang)口。
在(zai)java sdk中,如(ru)果用戶沒(mei)有設置Content-Type,會(hui)根據(ju)PutObjectRequest中file參數的(de)后綴擴展名(ming)自動生(sheng)成Content-Type。
請求參數
| 參數 | 類型 | 說明 |
|---|---|---|
| localPath | String | 要上傳的本地文件路徑 |
| bucket | String | 桶名 |
| key | String | 對象key |
| contentType | String | http contentType頭 |
| storageClass | StorageClass | 配置上傳對象的存儲類型,包括標準類型STANDARD、低頻類型STANDARD_IA以及歸檔類型GLACIER |
| metadata | ObjectMetadata | 對象自定義元數據 |
注意:acl在PutObjectRequest中設(she)置
初始化分片上傳任務
功能說明
分(fen)片上(shang)(shang)傳操作可以將超過5GB的大文件分(fen)割后上(shang)(shang)傳,分(fen)片上(shang)(shang)傳對象(xiang)首先需要發起分(fen)片上(shang)(shang)傳請求獲取一(yi)個upload id。
代碼示例
System.out.println("multiPartUpload");
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
InitiateMultipartUploadRequest initReq = new InitiateMultipartUploadRequest(bucket, key);
initReq.withCannedACL(CannedAccessControlList.PublicRead);
// initReq.setStorageClass(StorageClass.Standard); // 設置對象的存儲類型
InitiateMultipartUploadResult initRes = s3Client.initiateMultipartUpload(initReq);
System.out.println("multiPartUpload: init success, uploadId=" + initRes.getUploadId());請求參數
InitiateMultipartUploadRequest 可(ke)設置的參(can)數如下(xia):
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 桶名稱 | 是 |
| key | String | 對象的key | 是 |
| cannedAcl | CannedAccessControlList | 配置上傳對象的預定義的標準ACL信息,詳細說明見 設置對象訪問權限 一節 | 否 |
| storageClass | StorageClass | 配置上傳對象的存儲類型,包括標準類型STANDARD、低頻類型STANDARD_IA以及歸檔類型GLACIER | 否 |
| accessControlList | AccessControlList | 配置上傳對象的詳細ACL信息,詳細說明見 設置對象訪問權限 一節 | 是 |
| objectMetadata | ObjectMetadata | 對象的元數據信息 | 否 |
| tagging | ObjectTagging | 對象的標簽信息 | 否 |
返回結果
InitiateMultipartUploadResult 返回的屬性如(ru)下:
| 參數 | 類型 | 說明 |
|---|---|---|
| bucket | String | 執行分片上傳的桶的名稱 |
| key | String | 本次分片上傳對象的名稱 |
| uploadId | String | 本次生成分片上傳任務的id |
上傳分片
功能說明
初(chu)始化分(fen)(fen)片(pian)(pian)上(shang)(shang)(shang)傳(chuan)任務后(hou),指定分(fen)(fen)片(pian)(pian)上(shang)(shang)(shang)傳(chuan)任務的id可以上(shang)(shang)(shang)傳(chuan)分(fen)(fen)片(pian)(pian)數(shu)據,可以將大文件分(fen)(fen)割成分(fen)(fen)片(pian)(pian)后(hou)上(shang)(shang)(shang)傳(chuan),除(chu)了(le)最后(hou)一(yi)個(ge)分(fen)(fen)片(pian)(pian),每個(ge)分(fen)(fen)片(pian)(pian)的數(shu)據大小為(wei)5MB~5GB,每個(ge)分(fen)(fen)片(pian)(pian)上(shang)(shang)(shang)傳(chuan)任務最多(duo)上(shang)(shang)(shang)傳(chuan)10000個(ge)分(fen)(fen)片(pian)(pian)。
代碼示例
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
String uploadId = "<your-upload-id>";
?
InputStream stream1 = new ByteArrayInputStream(new byte[5*1024*1024]);
UploadPartRequest partReq1 = new UploadPartRequest();
partReq1.setBucketName(bucket);
partReq1.setKey(key);
partReq1.setUploadId(uploadId); // 在 initiateMultipartUpload 獲取
partReq1.setInputStream(stream1);
partReq1.setPartNumber(1); // 設置分片號代表這次復制是整個分片上傳任務中的第幾個分片,從1開始
partReq1.setObjectMetadata(new ObjectMetadata());
partReq1.setPartSize(stream1.available());
// rate 上傳限速,單位KB
partReq1.putCustomRequestHeader("x-amz-limit", String.format("rate=%d", 10));
UploadPartResult partRes1 = s3Client.uploadPart(partReq1);
System.out.println("multiPartUpload: uploadPart success, etag=" + partRes1.getETag());
?
InputStream stream2 = new ByteArrayInputStream(new byte[1*1024*1024]);
UploadPartRequest partReq2 = new UploadPartRequest();
partReq2.setBucketName(bucket);
partReq2.setKey(key);
partReq2.setUploadId(uploadId);
partReq2.setInputStream(stream2);
partReq2.setPartNumber(2);
partReq2.setPartSize(stream2.available());
// rate 上傳限速,單位KB
partReq2.putCustomRequestHeader("x-amz-limit", String.format("rate=%d", 10));
UploadPartResult partRes2 = s3Client.uploadPart(partReq2);
System.out.println("multiPartUpload: uploadPart success, etag=" + partRes2.getETag());請求參數
UploadPartRequest 可設置(zhi)的參數如(ru)下:
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 執行分片上傳的桶的名稱 | 是 |
| key | String | 對象的key | 是 |
| inputStream | InputStream | 對象的輸入數據流 | 是 |
| partNumber | int | 說明當前數據在文件中所屬的分片,大于等于1,小于等于10000 | 是 |
| uploadId | String | 通過 initiateMultipartUpload 操作獲取的UploadId,與一個分片上傳的對象對應 | 是 |
返回結果
UploadPartRequest 返(fan)回的(de)屬性如下:
| 參數 | 類型 | 說明 |
|---|---|---|
| etag | String | 本次上傳分片對應的Entity Tag |
合并分片
功能說明
合并指(zhi)定分(fen)片(pian)(pian)上(shang)(shang)傳任(ren)務(wu)id對應任(ren)務(wu)中已上(shang)(shang)傳的對象分(fen)片(pian)(pian),使之成為一個(ge)完整(zheng)的文件(jian)。
代碼示例
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
String uploadId = "<your-upload-id>";
PartETag tag1 = new PartETag(partReq1.getPartNumber(), partRes1.getETag()); //partNumber與eTag在上傳分片時獲取
PartETag tag2 = new PartETag(partReq2.getPartNumber(), partRes2.getETag());
List<PartETag> partETags = new ArrayList<>();
partETags.add(tag1);
partETags.add(tag2);
?
CompleteMultipartUploadRequest completeReq = new CompleteMultipartUploadRequest(bucket, key, uploadId, partETags);
CompleteMultipartUploadResult completeRes = s3Client.completeMultipartUpload(completeReq);
System.out.println("multiPartUpload: complete success, etag=" + completeRes.getETag());
System.out.println("bucket=" + completeRes.getBucketName());
System.out.println("key=" + completeRes.getKey());
System.out.println("location=" + completeRes.getLocation());
System.out.println("versionId=" + completeRes.getVersionId());請求參數
CompleteMultipartUploadRequest 可設(she)置(zhi)的(de)參數(shu)如下:
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 執行分片上傳的桶的名稱 | 是 |
| key | String | 對象的key | 是 |
| partETags | List<PartETag> | 包含了每個已上傳的分片的ETag和PartNumber等信息 | 是 |
| uploadId | String | 通過CreateMultipartUpload操作獲取的UploadId,與一個對象的分片上傳對應 | 是 |
返回結果
CompleteMultipartUploadResult 返(fan)回的屬(shu)性如下:
| 參數 | 類型 | 說明 |
|---|---|---|
| bucketName | String | 執行分片上傳的桶的名稱 |
| key | String | 對象的key |
| etag | String | 本次上傳對象后對應的Entity Tag |
| location | String | 合并生成對象的URI信息 |
| versionId | String | 上傳對象后相應的版本ID |
列舉分片上傳任務
功能說明
列舉分片上(shang)(shang)傳(chuan)操作可以(yi)(yi)列出一個桶(tong)中(zhong)正(zheng)在(zai)進(jin)行的(de)分片上(shang)(shang)傳(chuan),這些分片上(shang)(shang)傳(chuan)的(de)請(qing)求(qiu)已經(jing)發起,但(dan)是還(huan)(huan)沒(mei)完成(cheng)或者被中(zhong)止。listMultipartUploads 操作可以(yi)(yi)通過指定maxUploads參數(shu)來設置返回分片上(shang)(shang)傳(chuan)信(xin)息(xi)(xi)的(de)數(shu)量(liang),maxUploads參數(shu)的(de)最大值和(he)(he)默認(ren)值均為1000。如果(guo)返回結果(guo)中(zhong)的(de)isTruncated字(zi)段為true,表示還(huan)(huan)有符(fu)合條件(jian)的(de)分片上(shang)(shang)傳(chuan)信(xin)息(xi)(xi)沒(mei)有列出,可以(yi)(yi)通過設置請(qing)求(qiu)中(zhong)的(de)keyMarker和(he)(he)uploadIdMarker參數(shu),來列出符(fu)合篩選條件(jian)的(de)正(zheng)在(zai)上(shang)(shang)傳(chuan)的(de)分片信(xin)息(xi)(xi)。
代碼示例
public void listMultipartUploads(){
String bucket = "<your-bucket-name>";
ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucket);
MultipartUploadListing multipartUploadListing = s3Client.listMultipartUploads(listMultipartUploadsRequest);
for (MultipartUpload multipartUpload : multipartUploadListing.getMultipartUploads()) {
System.out.println("uploadId=" + multipartUpload.getUploadId());
System.out.println("initiator=" + multipartUpload.getInitiator());
System.out.println("initiated=" + multipartUpload.getInitiated());
System.out.println("key=" + multipartUpload.getKey());
}
}如(ru)果(guo)list大于1000,則返(fan)回(hui)的(de)結果(guo)中 isTruncated 為true,并返(fan)回(hui) NextKeyMarker NextUploadIdMarker 作為下次讀取(qu)的(de)起點(dian)。如(ru)果(guo)沒有(you)一(yi)次性獲(huo)取(qu)所(suo)有(you)的(de)分(fen)片(pian)(pian)上傳事(shi)(shi)件(jian),可以采用分(fen)頁列舉(ju)的(de)方式。列舉(ju)所(suo)有(you)分(fen)片(pian)(pian)上傳事(shi)(shi)件(jian)示例(li)代碼(ma)如(ru)下:
public void listMultipartUploads2(){
String bucket = "<your-bucket-name>";
MultipartUploadListing multipartUploadListing;
ListMultipartUploadsRequest listMultipartUploadsRequest = new
ListMultipartUploadsRequest(bucket);
do {
multipartUploadListing = s3Client.listMultipartUploads(listMultipartUploadsRequest);
for (MultipartUpload multipartUpload : multipartUploadListing.getMultipartUploads()) {
System.out.println("uploadId=" + multipartUpload.getUploadId());
System.out.println("initiator=" + multipartUpload.getInitiator());
System.out.println("initiated=" + multipartUpload.getInitiated());
System.out.println("key=" + multipartUpload.getKey());
}
listMultipartUploadsRequest.setKeyMarker(multipartUploadListing.getNextKeyMarker());
listMultipartUploadsRequest.setUploadIdMarker(multipartUploadListing.getNextUploadIdMarker());
} while (multipartUploadListing.isTruncated());
}請求參數
ListMultipartUploadsRequest 可設置的參數如(ru)下:
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 執行本操作的桶名稱 | 是 |
| delimiter | String | 與Prefix參數一起用于對對象key進行分組的字符。所有key包含指定的Prefix且第一次出現Delimiter字符之間的對象作為一組。如果沒有指定Prefix參數,按Delimiter對所有對象key進行分割,多個對象分割后從對象key開始到第一個Delimiter之間相同的部分形成一組 | 否 |
| encodingType | String | 用于設置response中object key的字符編碼類型 | 否 |
| keyMarker | String | 和uploadIdMarker參數一起用于指定返回哪部分分片上傳的信息。如果沒有設置uploadIdMarker參數,則只返回對象key按照字典順序排序后位于keyMarker標識符之后的分片信息。如果設置了uploadIdMarker參數,則會返回對象key等于keyMarker且uploadId大于uploadIdMarker的分片信息 | 否 |
| maxUploads | int | 用于指定相應消息體中正在進行的分片上傳信息的最大數量,最小值為1,默認值和最大值都是1000 | 否 |
| prefix | String | 與delimiter參數一起用于對對象key進行分組的字符。所有key包含指定的Prefix且第一次出現delimiter字符之間的對象作為一組 | 否 |
| uploadIdMarker | String | 和keyMarker參數一起用于指定返回哪部分分片上傳的信息,僅當設置了keyMarker參數的時候有效。設置后返回對象key等于keyMarker且uploadId大于uploadIdMarker的分片信息 | 否 |
返回結果
MultipartUploadListing 返回的屬性(xing)如(ru)下:
| 參數 | 類型 | 說明 |
|---|---|---|
| bucketName | String | 執行本操作的桶名稱 |
| commonPrefixes | List<String> | 當請求中設置了delimiter和prefix屬性時,所有包含指定的prefix且第一次出現delimiter字符的對象key作為一組 |
| delimiter | String | 與請求中設置的delimiter一致 |
| isTruncated | boolean | 當為false時表示返回結果中包含了全部符合本次請求查詢條件的上傳分片信息,否則只返回了數量為maxUploads個的分片信息 |
| keyMarker | String | 返回上傳分片列表中的起始對象的key |
| maxUploads | int | 本次返回結果中包含的上傳分片數量的最大值 |
| nextKeyMarker | String | 當isTruncated為true時,nextKeyMarker可以作為后續查詢已初始化的上傳分片請求中的keyMarker的值 |
| nextUploadIdMarker | String | 當isTruncated為true時,nextKeyMarker可以作為后續查詢已初始化的上傳分片請求中的uploadIdMarker的值 |
| prefix | String | 限定返回分片中對應對象的key必須以prefix作為前綴 |
| uploadIdMarker | String | 返回上傳分片列表中的起始uploadId |
| uploads | List<MultipartUpload> | 包含了零個或多個已初始化的上傳分片信息的數組。數組中的每一項包含了分片初始化時間、分片上傳操作發起者、對象key、對象擁有者、存儲類型和uploadId等息 |
列舉已上傳的分片
功能說明
列(lie)(lie)舉已(yi)上(shang)傳分(fen)(fen)片(pian)操作(zuo)可以列(lie)(lie)出(chu)一個分(fen)(fen)片(pian)上(shang)傳操作(zuo)中(zhong)(zhong)已(yi)經上(shang)傳完畢但是還(huan)未合并的(de)(de)分(fen)(fen)片(pian)信息。請求中(zhong)(zhong)需要提供(gong)object key和 upload id,返回的(de)(de)結(jie)果(guo)最多包(bao)含1000個已(yi)上(shang)傳的(de)(de)分(fen)(fen)片(pian)信息,默認(ren)返回1000個,可以通過設置maxParts參數的(de)(de)值指定返回結(jie)果(guo)中(zhong)(zhong)分(fen)(fen)片(pian)信息的(de)(de)數量。如果(guo)已(yi)上(shang)傳的(de)(de)分(fen)(fen)片(pian)信息的(de)(de)數量多于1000個,則返回結(jie)果(guo)中(zhong)(zhong)的(de)(de)isTruncated字段(duan)為true,可用通過設置partNumberMarker參數獲取partNumber大于該(gai)參數的(de)(de)分(fen)(fen)片(pian)信息。
代碼示例
public void listParts() {
System.out.println("ListParts");
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
String uploadId = "<your-upload-id>";
ListPartsRequest listParts = new ListPartsRequest(bucket, key, uploadId);
PartListing partListing = this.s3Client.listParts(listParts);
System.out.println("bukcet=" + partListing.getBucketName() + ", key=" + partListing.getKey() + ", uploadId="+partListing.getUploadId());
for (PartSummary part : partListing.getParts()) {
System.out.println("part number="+part.getPartNumber()+", size="+part.getSize());
}
}如果(guo)分片(pian)數大于1000,返回的(de) PartListing 中 isTruncated 為(wei) true ,并(bing)可以根據(ju) NextPartNumberMarker 為(wei)下一次請求的(de) list 的(de)起始位(wei)置(zhi)。
public void listParts2() {
System.out.println("ListParts");
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
String uploadId = "<your-upload-id>";
ListPartsRequest listParts = new ListPartsRequest(bucket, key, uploadId);
PartListing partListing;
ListPartsRequest listPartsRequest = new ListPartsRequest(bucket, key, uploadId);
do {
partListing = s3Client.listParts(listPartsRequest);
System.out.println("bukcet=" + partListing.getBucketName() + ", key=" + partListing.getKey() + ", uploadId="+partListing.getUploadId());
for (PartSummary part : partListing.getParts()) {
System.out.println("part number="+part.getPartNumber()+", size="+part.getSize());
}
listPartsRequest.setPartNumberMarker(partListing.getNextPartNumberMarker());
} while (partListing.isTruncated());
}請求參數
ListPartsRequest 可設置的參數如下:
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 執行本操作的桶名稱 | 是 |
| key | String | 對象的key | 是 |
| maxParts | int | 指定返回分片信息的數量,默認值和最大值均為1000 | 否 |
| partNumberMarker | int | 用于指定返回part number大于partNumberMarker的分片信息 | 否 |
| uploadId | String | 指定返回該id所屬的分片上傳的分片信息 | 是 |
返回結果
PartListing 返回的屬性如(ru)下(xia):
| 參數 | 類型 | 說明 |
|---|---|---|
| bucketName | String | 執行本操作的桶名稱 |
| key | String | 本次分片上傳對象的名稱 |
| isTruncated | boolean | 當為false時表示返回結果中包含了全部符合本次請求查詢條件的上傳分片信息,否則只返回了數量為MaxParts個的分片信息 |
| maxParts | int | 本次返回結果中包含的上傳分片數量的最大值 |
| nextPartNumberMarker | int | 當IsTruncated為true時,NextPartNumberMarker可以作為后續查詢已上傳分片請求中的PartNumberMarker的值 |
| parts | List<PartSummary> | 包含了已上傳分片信息的數組,數組中的每一項包含了該分片的Entity tag、最后修改時間、PartNumber和大小等信息 |
| uploadId | String | 本次分片上傳操作Id |
復制分片
功能說明
復(fu)(fu)制(zhi)(zhi)(zhi)(zhi)分(fen)片(pian)(pian)操作可(ke)以從(cong)一(yi)個(ge)(ge)(ge)已存(cun)在的(de)(de)對象(xiang)中復(fu)(fu)制(zhi)(zhi)(zhi)(zhi)指(zhi)定分(fen)片(pian)(pian)的(de)(de)數(shu)據。您可(ke)以使(shi)用(yong) copyPart 復(fu)(fu)制(zhi)(zhi)(zhi)(zhi)分(fen)片(pian)(pian)。在復(fu)(fu)制(zhi)(zhi)(zhi)(zhi)分(fen)片(pian)(pian)前,需(xu)要使(shi)用(yong) initiateMultipartUpload 接口獲(huo)取一(yi)個(ge)(ge)(ge)upload id,在完成(cheng)(cheng)復(fu)(fu)制(zhi)(zhi)(zhi)(zhi)和(he)上傳(chuan)分(fen)片(pian)(pian)操作之后,需(xu)要使(shi)用(yong) completeMultipartUpload 操作組裝分(fen)片(pian)(pian)成(cheng)(cheng)為(wei)一(yi)個(ge)(ge)(ge)對象(xiang)。當復(fu)(fu)制(zhi)(zhi)(zhi)(zhi)的(de)(de)對象(xiang)大小(xiao)超過(guo)5GB,必須使(shi)用(yong)復(fu)(fu)制(zhi)(zhi)(zhi)(zhi)分(fen)片(pian)(pian)操作完成(cheng)(cheng)對象(xiang)的(de)(de)復(fu)(fu)制(zhi)(zhi)(zhi)(zhi)。除了最后一(yi)個(ge)(ge)(ge)分(fen)片(pian)(pian)外,每(mei)個(ge)(ge)(ge)復(fu)(fu)制(zhi)(zhi)(zhi)(zhi)分(fen)片(pian)(pian)的(de)(de)大小(xiao)范圍是(shi)[5MB,5GB]。
代碼示例
String destBucketName = "<your-bucket-name>";
String destObjectKey = "<your-object-key>";
String sourceBucketName = "<source-bucket-name>";
String sourceObjectKey = "<source-object-key>";
?
List<PartEtag> partEtags = new ArrayList<PartEtag>();
// 創建分片復制請求
CopyPartRequest copyRequest = new CopyPartRequest()
//設置源桶和對象,目標桶和對象
.withSourceBucketName(sourceBucketName)
.withSourceKey(sourceObjectKey)
.withDestinationBucketName(destBucketName)
.withDestinationKey(destObjectKey)
//uploadId為initiateMultipartUpload中返回值
.withUploadId(initResult.getUploadId())
//設置分片復制范圍
.withFirstByte(firstByte)
.withLastByte(lastByte)
//設置分片號,代表這次復制是整個分片上傳任務中的第幾個分片
.withPartNumber(partNum);
?
CopyPartResult copyPartResult = s3.copyPart(copyRequest);
partETags.add(copyPartResult.getPartETag()); //把 partETag 放入 PartEtag 列表中,合并分片是需要此參數
System.out.println("multiPartCopy: copyPart success, part " + partNum + ", etag=" + copyPartResult.getETag());
System.out.println("lastModifiedDate=" + copyPartResult.getLastModifiedDate());
System.out.println("partNumber=" + copyPartResult.getPartNumber());請求參數
copyRequest 可設置(zhi)的參數如下:
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| sourceBucketName | String | 源桶名稱 | 是 |
| sourceKey | String | 源對象key | 是 |
| destinationBucketName | String | 目標桶名稱 | 是 |
| destinationKey | String | 目標對象key | 是 |
| matchingETagConstraints | List<String> | 用于指定只有在源對象的eTag和該參數值匹配的情況下才進行復制操作。 | 否 |
| modifiedSinceConstraint | Date | 用于只有當源對象在指定時間后被修改的情況下才進行復制操作 | 否 |
| nonmatchingEtagConstraints | List<String> | 用于指定只有在源對象的eTag和該參數值不匹配的情況下才進行復制操作。 | 否 |
| unmodifiedSinceConstraint | Date | 用于僅當源自指定時間以來未被修改的情況下才進行復制操作 | 否 |
| firstByte | long | 指定本次分片復制的數據范圍,源對象的起始字節 | 是 |
| lastByte | long | 指定本次分片復制的數據范圍,源對象的結束字節 | 是 |
| partNumber | int | 說明本次分片復制的數據在原對象中所屬的部分 | 是 |
| uploadId | String | 與本次復制操作相應的分片上傳Id | 是 |
返回結果
CopyPartResult 返回(hui)的屬性如下:
| 參數 | 類型 | 說明 |
|---|---|---|
| etag | String | 包含復制分片的Entity Tag |
| lastModifiedDate | Date | 復制分片的最新修改時間 |
| partNumber | String | 分片序號 |
取消分片上傳任務
功能說明
取(qu)消分(fen)(fen)(fen)片(pian)(pian)(pian)(pian)上(shang)(shang)傳任(ren)(ren)務操(cao)作用(yong)于(yu)終止(zhi)(zhi)一個(ge)分(fen)(fen)(fen)片(pian)(pian)(pian)(pian)上(shang)(shang)傳。當一個(ge)分(fen)(fen)(fen)片(pian)(pian)(pian)(pian)上(shang)(shang)傳被(bei)中(zhong)止(zhi)(zhi)后,不(bu)會(hui)(hui)再有(you)數據通過與(yu)之相(xiang)應(ying)的(de)(de)(de)(de)upload id上(shang)(shang)傳,同(tong)時已經(jing)被(bei)上(shang)(shang)傳的(de)(de)(de)(de)分(fen)(fen)(fen)片(pian)(pian)(pian)(pian)所(suo)(suo)占用(yong)的(de)(de)(de)(de)空(kong)(kong)間(jian)會(hui)(hui)被(bei)釋(shi)放。執(zhi)(zhi)行取(qu)消分(fen)(fen)(fen)片(pian)(pian)(pian)(pian)上(shang)(shang)傳任(ren)(ren)務操(cao)作后,正在(zai)上(shang)(shang)傳的(de)(de)(de)(de)分(fen)(fen)(fen)片(pian)(pian)(pian)(pian)可(ke)(ke)(ke)能會(hui)(hui)上(shang)(shang)傳成功也(ye)可(ke)(ke)(ke)能會(hui)(hui)被(bei)中(zhong)止(zhi)(zhi),所(suo)(suo)以必要的(de)(de)(de)(de)情況(kuang)下需要執(zhi)(zhi)行多次(ci)取(qu)消分(fen)(fen)(fen)片(pian)(pian)(pian)(pian)上(shang)(shang)傳任(ren)(ren)務操(cao)作去釋(shi)放全部上(shang)(shang)傳成功的(de)(de)(de)(de)分(fen)(fen)(fen)片(pian)(pian)(pian)(pian)所(suo)(suo)占用(yong)的(de)(de)(de)(de)空(kong)(kong)間(jian)。可(ke)(ke)(ke)以通過執(zhi)(zhi)行列(lie)舉已上(shang)(shang)傳分(fen)(fen)(fen)片(pian)(pian)(pian)(pian)操(cao)作來確認所(suo)(suo)有(you)中(zhong)止(zhi)(zhi)分(fen)(fen)(fen)片(pian)(pian)(pian)(pian)上(shang)(shang)傳后所(suo)(suo)有(you)已上(shang)(shang)傳分(fen)(fen)(fen)片(pian)(pian)(pian)(pian)的(de)(de)(de)(de)空(kong)(kong)間(jian)是否被(bei)被(bei)釋(shi)放。
代碼示例
String bucket = "<your-bucket-name>";
String key = "<your-object-key>";
String uploadId = "<your-upload-id>";
System.out.println("multiPartUpload: error=" + e.getMessage());
AbortMultipartUploadRequest abortReq = new AbortMultipartUploadRequest(bucket, key, uploadId);
s3Client.abortMultipartUpload(abortReq);請求參數
AbortMultipartUploadRequest 可設置的(de)參數(shu)如下:
| 參數 | 類型 | 說明 | 是否必要 |
|---|---|---|---|
| bucket | String | 執行本操作的桶名稱 | 是 |
| key | String | 分片上傳的對象的key | 是 |
| uploadId | String | 指定需要終止的分片上傳的id | 是 |