断点续传上传
本文介绍如何使用断点续传上传。
在无线网络下,上传比较大的文件持续时间长,可能会遇到因为网络条件差、用户切换网络等原因导致上传中途失败,整个文件需要重新上传。为此,SDK提供了断点续传上传功能。
注意
- 断点续传上传暂时只支持上传本地文件。
- 对于移动端来说,如果不是比较大的文件,不建议使用这种方式上传,因为断点续传上传是通过分片上传实现的,上传单个文件需要进行多次网络请求,效率不高。
通过断点续传上传的方式将文件上传到OSS前,您可以指定断点记录的保存文件夹。
- 断点续传上传只在本次上传生效。如果未指定断点记录的保存文件夹,假设某个分片因为网络原因等导致文件上传失败时,将耗用大量的重试时间及流量来重新上传整个大文件。
- 如果指定了断点记录的保存文件夹,在文件上传失败时,将从断点记录处继续上传未上传完成的部分。
断点续传上传时如果同一任务一直得不到续传,可能会在OSS上积累无用碎片。此时,您可以通过为Bucket设置lifeCycle规则的方式来定时清理碎片。详情请参考:生命周期管理。
说明
- 断点续传上传需要依赖InitMultipartUpload、UploadPart、ListParts、CompleteMultipartUpload、AbortMultipartUpload这些接口来实现。如果您需要通过STS鉴权模式来使用断点续传上传,则需要保证您拥有访问上述API接口的权限。
- 断点续传上传也支持上传后回调通知,使用用法与常见的上传回调通知一致。
- 断点续传上传默认已开启每个分片上传时的MD5校验,因此无需在request中设置
Content-Md5
头部。
- 断点记录不在本地持久保存时的调用方式如下:
// 创建断点上传请求 ResumableUploadRequest request = new ResumableUploadRequest("<bucketName>", "<objectKey>", "<uploadFilePath>"); // 设置上传过程回调 request.setProgressCallback(new OSSProgressCallback<ResumableUploadRequest>() { @Override public void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) { Log.d("resumableUpload", "currentSize: " + currentSize + " totalSize: " + totalSize); } }); // 异步调用断点上传 OSSAsyncTask resumableTask = oss.asyncResumableUpload(request, new OSSCompletedCallback<ResumableUploadRequest, ResumableUploadResult>() { @Override public void onSuccess(ResumableUploadRequest request, ResumableUploadResult result) { Log.d("resumableUpload", "success!"); } @Override public void onFailure(ResumableUploadRequest request, ClientException clientExcepion, ServiceException serviceException) { // 异常处理 } }); // resumableTask.waitUntilFinished(); // 可以等待直到任务完成
- 断点记录在本地持久保存时的调用方式如下:
String recordDirectory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/oss_record/"; File recordDir = new File(recordDirectory); // 要保证目录存在,如果不存在则主动创建 if (!recordDir.exists()) { recordDir.mkdirs(); } // 创建断点上传请求,参数中给出断点记录文件的保存位置,需是一个文件夹的绝对路径 ResumableUploadRequest request = new ResumableUploadRequest("<bucketName>", "<objectKey>", "<uploadFilePath>", recordDirectory); // 设置上传过程回调 request.setProgressCallback(new OSSProgressCallback<ResumableUploadRequest>() { @Override public void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) { Log.d("resumableUpload", "currentSize: " + currentSize + " totalSize: " + totalSize); } }); OSSAsyncTask resumableTask = oss.asyncResumableUpload(request, new OSSCompletedCallback<ResumableUploadRequest, ResumableUploadResult>() { @Override public void onSuccess(ResumableUploadRequest request, ResumableUploadResult result) { Log.d("resumableUpload", "success!"); } @Override public void onFailure(ResumableUploadRequest request, ClientException clientExcepion, ServiceException serviceException) { // 异常处理 } }); // resumableTask.waitUntilFinished();
- 以下代码用于实现断点续传上传:
//调用OSSAsyncTask cancel()方法时是否需要删除断点记录文件的设置 String recordDirectory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/oss_record/"; File recordDir = new File(recordDirectory); // 要保证目录存在,如果不存在则主动创建 if (!recordDir.exists()) { recordDir.mkdirs(); } // 创建断点上传请求,参数中给出断点记录文件的保存位置,需是一个文件夹的绝对路径 ResumableUploadRequest request = new ResumableUploadRequest("<bucketName>", "<objectKey>", "<uploadFilePath>", recordDirectory); //设置false,取消时,不删除断点记录文件,如果不进行设置,默认true,是会删除断点记录文件,下次再进行上传时会重新上传。 request.setDeleteUploadOnCancelling(false); // 设置上传过程回调 request.setProgressCallback(new OSSProgressCallback<ResumableUploadRequest>() { @Override public void onProgress(ResumableUploadRequest request, long currentSize, long totalSize) { Log.d("resumableUpload", "currentSize: " + currentSize + " totalSize: " + totalSize); } }); OSSAsyncTask resumableTask = oss.asyncResumableUpload(request, new OSSCompletedCallback<ResumableUploadRequest, ResumableUploadResult>() { @Override public void onSuccess(ResumableUploadRequest request, ResumableUploadResult result) { Log.d("resumableUpload", "success!"); } @Override public void onFailure(ResumableUploadRequest request, ClientException clientExcepion, ServiceException serviceException) { // 异常处理 } }); // resumableTask.waitUntilFinished();
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论