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-阿里云