分片上传接口
更新时间 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) {
}
});
}