分片上傳接口
更新時間 2025-10-11 11:19:13
最近更新時間: 2025-10-11 11:19:13
分享文章
融合接口
SDK提供封裝好的融合接口,方便用戶實現分片上傳的功能。
接口定義
public TransferObserver upload(String bucket, String key, File file)
?
public TransferObserver upload(String bucket, String key, File file, CannedAccessControlList cannedAcl)
?
public TransferObserver upload(String bucket, String key, File file, ObjectMetadata metadata)
?
public TransferObserver upload(String bucket, String key, File file, ObjectMetadata metadata, CannedAccessControlList cannedAcl)
?
public TransferObserver upload(String bucket, String key, File file, ObjectMetadata metadata, CannedAccessControlList cannedAcl, TransferListener listener)參數說明
| 參數名 | 類型 | 說明 |
|---|---|---|
| bucketName | String | bucket名 |
| key | String | 要上傳的對象名稱 |
| file | FILE | 上傳的文件對象 |
| metadata | ObjectMetadata | 可選參數,元數據,可以設置ContentType和自定義元數據 |
| cannedAcl | CannedAccessControlList | 文件操作權限(Private|PublicRead) |
| listener | TransferListener | 上傳文件回調 |
代碼示例
private void beginUpload(File file) {
TransferUtility transferUtility = TransferUtility.builder()
.context(context)
.s3Client(S3Client)
.build();
TransferObserver observer = transferUtility.upload(
bucketName,
key,
file
);
}關于Content-Type的配置
Content-Type用于標識文件的資源類型,比如image/png, image/jpg 是圖片類型,video/mpeg, video/mp4是視頻類型,text/plain, text/html是文本類型, 瀏覽器針對不同的Content-Type會有不同的操作,比如圖片類型可以預覽,視頻類型可以播放,文本類型可以直接打開。application/octet-stream類型會直接打開下載窗口。
在android sdk中,如果用戶沒有設置Content-Type,會根據對象的key后綴擴展名自動生成Content-Type。
創建分片上傳任務
創建分片上傳任務,返回分片上傳任務的ID。
接口定義
public InitiateMultipartUploadResult initiateMultipartUpload(
InitiateMultipartUploadRequest initiateMultipartUploadRequest)參數說明
| 參數名 | 類型 | 說明 |
|---|---|---|
| bucketName | String | bucket名 |
| key | String | 要上傳的對象名 |
| cannedACL | CannedAccessControlList | 權限設置 |
| objectMetadata | ObjectMetadata | 可選參數,元數據,可以設置ContentType和自定義元數據 |
代碼示例
public void InitiateMultipartUpload(String bucketName, String objectKey,
OnS3ResponseListener<InitiateMultipartUploadResult> listener) {
GlobalThreadPool.getInstance().execute(() -> {
try {
InitiateMultipartUploadRequest initiateMultipartUploadRequest =
new InitiateMultipartUploadRequest(bucketName, objectKey);
InitiateMultipartUploadResult result = sS3Client.initiateMultipartUpload(initiateMultipartUploadRequest);
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(() -> listener.onResponse(result));
} catch (Exception e) {
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(() -> listener.onError());
}
});
}上傳一個分片
獲取到分片任務ID之后,通過ID來上傳分片內容到S3服務器。
接口定義
public UploadPartResult uploadPart(UploadPartRequest uploadPartRequest)參數說明
| 參數名 | 類型 | 說明 |
|---|---|---|
| bucketName | String | bucket名 |
| key | String | 要上傳的對象名稱 |
| file | FILE | 上傳的文件對象 |
| uploadId | String | 上傳任務ID |
| partSize | long | 上傳內容長度 |
| partNum | int | 分片ID(1-10000) |
| fileOffset | long | 文件起始位置 |
代碼示例
public void UploadPart(String bucketName, String objectKey, String uploadId,
int partNum, File file, int filePosition, int partSize,
OnS3ResponseListener<UploadPartResult> listener) {
GlobalThreadPool.getInstance().execute(() -> {
try {
UploadPartRequest uploadPartRequest = new UploadPartRequest()
.withBucketName(bucketName)
.withKey(objectKey)
.withUploadId(uploadId)
.withPartNumber(partNum)
.withFileOffset(filePosition)
.withFile(file)
.withPartSize(partSize);
UploadPartResult result = sS3Client.uploadPart(uploadPartRequest);
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(() -> listener.onResponse(result));
} catch (Exception e) {
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(() -> listener.onError());
}
});
}完成分片上傳任務
完成所有分片的上傳之后,調用完成接口,服務端會把所有分片合并成對象保存。
接口定義
public CompleteMultipartUploadResult completeMultipartUpload(
CompleteMultipartUploadRequest completeMultipartUploadRequest)參數說明
| 參數名 | 類型 | 說明 |
|---|---|---|
| bucketName | String | bucket名 |
| key | String | 要上傳的對象名 |
| uploadId | String | 上傳任務ID |
| partETags | List<PartETag> | 上傳的分片信息列表 |
代碼示例
public void CompleteMultipartUpload(String bucketName,
String objectKey,
String uploadId,
List<PartETag> partETags,
OnS3ResponseListener<CompleteMultipartUploadResult> listener) {
GlobalThreadPool.getInstance().execute(() -> {
try {
CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(
bucketName, objectKey, uploadId, partETags);
CompleteMultipartUploadResult result = sS3Client.completeMultipartUpload(completeMultipartUploadRequest);
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(() -> listener.onResponse(result));
} catch (Exception e) {
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(() -> listener.onError());
}
});
}終止分片上傳任務
上傳失敗的時候調用此接口,服務器會清除殘留的分片數據。
接口定義
public void abortMultipartUpload(AbortMultipartUploadRequest abortMultipartUploadRequest)參數說明
| 參數名 | 類型 | 說明 |
|---|---|---|
| bucketName | String | bucket名 |
| key | String | 要上傳的對象名 |
| uploadId | String | 上傳任務ID |
代碼示例
public void AbortMultipartUpload(String bucketName, String objectKey, String uploadId) {
GlobalThreadPool.getInstance().execute(() -> {
try {
AbortMultipartUploadRequest abortMultipartUploadRequest = new AbortMultipartUploadRequest(
bucketName, objectKey, uploadId);
sS3Client.abortMultipartUpload(abortMultipartUploadRequest);
} catch (Exception e) {
}
});
}