閱讀238 返回首頁    go 微信


分片上傳__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

  上一篇:go 中文和時間__Python-SDK_SDK 參考_對象存儲 OSS-阿裏雲
  下一篇:go 異常響應__Android-SDK_SDK 參考_對象存儲 OSS-阿裏雲