238
微信
分片上傳__Android-SDK_SDK 參考_對象存儲 OSS-阿裏雲
下麵演示通過分片上傳文件的整個流程。
初始化分片上傳
String uploadId;
InitiateMultipartUploadRequest init = new InitiateMultipartUploadRequest("<bucketName>", "<objectKey>");
InitiateMultipartUploadResult initResult = oss.initMultipartUpload(init);
uploadId = initResult.getUploadId();
- 我們用InitiateMultipartUploadRequest來指定上傳文件的名字和所屬存儲空間(Bucket)。
- 在InitiateMultipartUploadRequest中,您也可以設置ObjectMeta,但是不必指定其中的ContentLength 。
- initiateMultipartUpload 的返回結果中含有UploadId ,它是區分分片上傳事件的唯一標識,在後麵的操作中,我們將用到它。
上傳分片
long partSize = 128 * 1024; // 設置分片大小
int currentIndex = 1; // 上傳分片編號,從1開始
File uploadFile = new File("<uploadFilePath>"); // 需要分片上傳的文件
InputStream input = new FileInputStream(uploadFile);
long fileLength = uploadFile.length();
long uploadedLength = 0;
List<PartETag> partETags = new ArrayList<PartETag>(); // 保存分片上傳的結果
while (uploadedLength < fileLength) {
int partLength = (int)Math.min(partSize, fileLength - uploadedLength);
byte[] partData = IOUtils.readStreamAsBytesArray(input, partLength); // 按照分片大小讀取文件的一段內容
UploadPartRequest uploadPart = new UploadPartRequest("<bucketName>", "<objectKey>", uploadId, currentIndex);
uploadPart.setPartContent(partData); // 設置分片內容
UploadPartResult uploadPartResult = oss.uploadPart(uploadPart);
partETags.add(new PartETag(currentIndex, uploadPartResult.getETag())); // 保存分片上傳成功後的結果
uploadedLength += partLength;
currentIndex++;
}
- 上麵程序的核心是調用UploadPart方法來上傳每一個分片,但是要注意以下幾點:
- UploadPart 方法要求除最後一個Part以外,其他的Part大小都要大於100KB。但是Upload Part接口並不會立即校驗上傳 Part的大小(因為不知道是否為最後一塊);隻有當Complete Multipart Upload的時候才會校驗。
- OSS會將服務器端收到Part數據的MD5值放在ETag頭內返回給用戶。
- Part號碼的範圍是1~10000。如果超出這個範圍,OSS將返回InvalidArgument的錯誤碼。
- 每次上傳part時都要把流定位到此次上傳片開頭所對應的位置。
- 每次上傳part之後,OSS的返回結果會包含一個分片的ETag,您需要將它和塊編號組合成PartEtag,保存在list中,後續完成分片上傳需要用到。
完成分片上傳
CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest("<bucketName>", "<objectKey>", uploadId, partETags);
CompleteMultipartUploadResult completeResult = oss.completeMultipartUpload(complete);
Log.d("multipartUpload", "multipart upload success! Location: " + completeResult.getLocation());
上麵代碼中的 partETags 就是進行分片上傳中保存的partETag的列表,OSS收到用戶提交的Part列表後,會逐一驗證每個數據Part的有效性。 當所有的數據Part驗證通過後,OSS會將這些part組合成一個完整的文件。
完成分片上傳(設置ServerCallback)
CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest("<bucketName>", "<objectKey>", uploadId, partETags);
CompleteMultipartUploadResult completeResult = oss.completeMultipartUpload(complete);
complete.setCallbackParam(new HashMap<String, String>() {
{
put("callbackUrl", "<server address>");
put("callbackBody", "<test>");
}
});
Log.d("multipartUploadWithServerCallback", completeResult.getServerCallbackReturnBody());
完成分片上傳請求可以設置Server Callback參數,請求完成後會向指定的Server Adress發送回調請求。
刪除分片上傳事件
我們可以用 abortMultipartUpload 方法取消分片上傳。
AbortMultipartUploadRequest abort = new AbortMultipartUploadRequest("<bucketName>", "<objectKey>", uploadId);
oss.abortMultipartUpload(abort); // 若無異常拋出說明刪除成功
羅列分片
我們可以用 listParts 方法獲取某個上傳事件所有已上傳的分片。
ListPartsRequest listParts = new ListPartsRequest("<bucketName>", "<objectKey>", uploadId);
ListPartsResult result = oss.listParts(listParts);
for (int i = 0; i < result.getParts().size(); i++) {
Log.d("listParts", "partNum: " + result.getParts().get(i).getPartNumber());
Log.d("listParts", "partEtag: " + result.getParts().get(i).getETag());
Log.d("listParts", "lastModified: " + result.getParts().get(i).getLastModified());
Log.d("listParts", "partSize: " + result.getParts().get(i).getSize());
}
- 默認情況下,如果存儲空間中的分片上傳事件的數量大於1000,則隻會返回1000個Multipart Upload信息,且返回結果中 IsTruncated 為false,並返回 NextPartNumberMarker作為下此讀取的起點。
- 若想增大返回分片上傳事件數目,可以修改 MaxParts 參數,或者使用 PartNumberMarker 參數分次讀取。
最後更新:2016-11-23 16:04:10
上一篇:
中文和時間__Python-SDK_SDK 參考_對象存儲 OSS-阿裏雲
下一篇:
異常響應__Android-SDK_SDK 參考_對象存儲 OSS-阿裏雲
ODPSWriter__Writer插件_使用手冊_數據集成-阿裏雲
RequestParameter__數據類型_API_API 網關-阿裏雲
每個連接達不到帶寬峰值__帶寬峰值常見問題_常見問題_負載均衡-阿裏雲
1.4 導入數據__快速入門_分析型數據庫-阿裏雲
漏洞收集流程__產品簡介_先知計劃-阿裏雲
刪除域名接口__域名管理接口_Open API_HTTPDNS-阿裏雲
雲服務器 ECS 登錄 Linux 實例
如何獲取更多技術信息__常見問題_雲數據庫 HybridDB-阿裏雲
圖片上傳__老版圖片服務手冊_對象存儲 OSS-阿裏雲
處理-使用訪問日誌統計__最佳實踐_日誌服務-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲