oss多线程 上传_oss-android/ios-sdk 断点续传(多线程)

oss-android/ios-sdk 断点续传

前言

移动端现状

随着移动端设备的硬件水平的不断提高,如今的cpu,内存等方面都大大的超过了一般的pc电脑,因此在现今的程序中,合理的使用多线程去完成一些事情是非常有必要的。

多线程上传的好处

进一步占满网络资源。

进一步占满I/O资源。

实现原理

策略

oss有分片上传的功能,断点续传就是基于分片上传的几个api接口进行的封装,主要由InitiateMultipartUpload,UploadPart,CompleteMultipartUpload,AbortMultipartUpload,ListParts这几个组成。

流程

细节

断点续传是一个大任务,又3部分来完成,分别是获取uploadId,分片上传,完成上传,这一整个连续的步骤统一在一个线程中进行。

获取uploadId这块需要先对本地缓存文件进行获取,如未拿到,就会直接重新生成新的uploadId直接去进行分片上传,否则会对记录的id进行之前上传了多少片进行还原,继续原来的位置继续上传。

分片上传部分,采用多线程并发上传机制,目前线程开启数量最多5条,根据cpu的核数进行判断,如果核数<5

会采用核数进行配置, 分片的个数最多5000。

完成上传,对上传的part进行排序,需要按照自然顺序1~n 的顺序进行上传。

文件校验,通过文件的md5等其他信息进行校验,分片上传中每一片也会跟服务器做md5校验。

进度回调机制,目前进度回调算是最基础版,目前回调原理是根据每一个分片来回调的,即当分片上传成功回调一次。

使用方式

在本地持久保存断点记录的调用方式:

android:

", "", "", recordDirectory);\n // 设置上传过程回调\nrequest.setProgressCallback(new OSSProgressCallback() {\n @Override\n public void onProgress(ResumableUploadRequest request\n , long currentSize, long totalSize) {\n Log.d("resumableUpload", "currentSize: " + currentSize + " totalSize: " + totalSize);\n }\n});\nOSSAsyncTask resumableTask = oss.asyncResumableUpload(request\n , new OSSCompletedCallback() {\n @Override\n public void onSuccess(ResumableUploadRequest request, ResumableUploadResult result) {\n Log.d("resumableUpload", "success!");\n }\n \n @Override\n public void onFailure(ResumableUploadRequest request, ClientException clientExcepion\n , ServiceException serviceException) {\n // 异常处理\n }\n});","classes":null}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet" class="cke_widget_element">String recordDirectory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/oss_record/";

File recordDir = new File(recordDirectory);

// 要保证目录存在,如果不存在则主动创建

if (!recordDir.exists()) {

recordDir.mkdirs();

}

// 创建断点上传请求,参数中给出断点记录文件的保存位置,需是一个文件夹的绝对路径

ResumableUploadRequest request

= new ResumableUploadRequest("", "", "", recordDirectory);

// 设置上传过程回调

request.setProgressCallback(new OSSProgressCallback() {

@Override

public void onProgress(ResumableUploadRequest request

, long currentSize, long totalSize) {

Log.d("resumableUpload", "currentSize: " + currentSize + " totalSize: " + totalSize);

}

});

OSSAsyncTask resumableTask = oss.asyncResumableUpload(request

, new OSSCompletedCallback() {

@Override

public void onSuccess(ResumableUploadRequest request, ResumableUploadResult result) {

Log.d("resumableUpload", "success!");

}

@Override

public void onFailure(ResumableUploadRequest request, ClientException clientExcepion

, ServiceException serviceException) {

// 异常处理

}

});

ios:

;\nresumableUpload.objectKey = ;\nresumableUpload.partSize = 1024 * 1024;\nresumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {\n NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);\n};\n \nresumableUpload.uploadingFileURL = [NSURL fileURLWithPath:];\nNSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];\nresumableUpload.recordDirectoryPath = cachesDir;//记录断点的文件路径\nOSSTask * resumeTask = [client resumableUpload:resumableUpload];\n[resumeTask continueWithBlock:^id(OSSTask *task) {\n if (task.error) {\n NSLog(@"error: %@", task.error);\n if ([task.error.domain isEqualToString:OSSClientErrorDomain]\n && task.error.code == OSSClientErrorCodeCannotResumeUpload) {\n // 该任务无法续传,需要获取新的uploadId重新上传\n }\n } else {\n NSLog(@"Upload file success");\n }\n return nil;\n}];","classes":null}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet" class="cke_widget_element">// 获得UploadId进行上传,如果任务失败并且可以续传,利用同一个UploadId可以上传同一文件到同一个OSS上的存储对象

OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];

resumableUpload.bucketName = ;

resumableUpload.objectKey = ;

resumableUpload.partSize = 1024 * 1024;

resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {

NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);

};

resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:];

NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

resumableUpload.recordDirectoryPath = cachesDir;//记录断点的文件路径

OSSTask * resumeTask = [client resumableUpload:resumableUpload];

[resumeTask continueWithBlock:^id(OSSTask *task) {

if (task.error) {

NSLog(@"error: %@", task.error);

if ([task.error.domain isEqualToString:OSSClientErrorDomain]

&& task.error.code == OSSClientErrorCodeCannotResumeUpload) {

// 该任务无法续传,需要获取新的uploadId重新上传

}

} else {

NSLog(@"Upload file success");

}

return nil;

}];

性能统计

数据分析

android/ios 端的分片上传改为并发后的测试与之前对比,上传分片的网络请求速度 多线程 和

单线程是一样的使用时间,这个主要是取决于带宽速度, 多线程相较于单线程主要是提高了读取文件的io时间。数据如下:

分享:

喜欢

0

赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生病了女朋友说要「陪床」,结果真的是陪床不是陪我......

1 生病住院了女朋友说要来陪床结果真的是陪床不是陪我......▼2 气氛突然微妙......▼3 隔壁的一家人都馋哭了&#xff01;▼4 上街偷拍帅哥的正确方法▼5 WOW!AMAZING!▼6 史上最强小学生出现了&#xff01;▼‍7 养二哈不光挺费家具的还挺废人的▼你点的每个赞&#x…

uiuc计算机课程,UIUC计算机科学专业解读

UIUC的计算机科学专业创建于1972年&#xff0c;到1986年基本定型&#xff0c;十多年来几乎没有什么变化。其中&#xff0c;数值分析方向课程中&#xff0c;Math225为矩阵论&#xff0c;CS257为数值方法&#xff0c;CS35x代表数值分析导论、常微分数值方法、偏微分与数值逼近和数…

Nutch 是一个开源Java 实现的搜索引擎

Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。 Nutch的创始人是Doug Cutting&#xff0c;他同时也是Lucene、Hadoop和Avro开源项目的创始人。Nutch 诞生于2002年8月&#xff0c;是Apache旗下的一个用Java实现的…

我的KT库之----数据对象

了解或者认识KT&#xff1a; http://www.cnblogs.com/kingthy/archive/2011/08/08/2130973.html 在项目中如何使用KT&#xff1f; KT是一个库&#xff0c;所以将KT的dll文件引用到您的项目上即可使用KT里的函数功能。 本节将介绍大家认识KT库里的数据对象(DbObject)。KT里的数据…

System.Text.Json 自定义 Conveter

System.Text.Json 自定义 ConveterIntroSystem.Text.Json 作为现在 .NET 默认提供的高性能 JSON 序列化器&#xff0c;对于一些比较特殊类型支持的并不太好&#xff0c;业务需求中总是有各种各样的需要&#xff0c;很多时候就需要用到自定义 Converter &#xff0c;对于微软新出…

jwt的token自动续约_JWT(JSON Web Token)自动延长到期时间

cchamberlain..6如果您使用的是节点(React/Redux/Universal JS),则可以安装npm i -S jwt-autorefresh.此库根据用户计算的访问令牌到期之前的秒数(基于令牌中编码的exp声明)计划刷新JWT令牌.它有一个广泛的测试套件,可以检查很多条件,以确保任何奇怪的活动都伴随着有关环境配置…

50张图,带你认识大学各专业

全世界只有3.14 % 的人关注了爆炸吧知识专业选的好每天像高考掐指一算&#xff0c;开学就近在眼前。当初纠结自己是考清华还是北大的那一幕也还是历历在目。不过&#xff0c;最后还是没有选择他们&#xff0c;一是因为北京离家太远&#xff0c;怕自己想家&#xff0c;二是因为他…

通达学院计算机组成原理试卷及答案,2021全国网络工程专业大学排名(5篇)

2018全国网络工程专业大学排名(5篇)高考填报志愿选择专业的话&#xff0c;考生需要了解你选择的专业在全国排名怎么样以及选择学校开设的专业在全国排名怎么样&#xff1f;高考升学网小编带你一起了解关于网络工程开设专业的大学排名。以及网络工程就业前景排名怎么样&#xff…

diff和patch工具使用(转)

本文转自 http://blog.chinaunix.net/uid-22848040-id-1767554.html diff和patch是一对工具&#xff0c;在数学上来说&#xff0c;diff是对两个集合的差运算&#xff0c;patch是对两个集合的和运算。 diff比较两个文件或文件集合的差异&#xff0c;并记录下来&#xff0c;生成…

自动布局

以前iOS 布局UI界面的经常编写大量的坐标计算代码为了保证在3.5 4.0屏幕上都有完美UI界面效果 有时需要分别为2中屏幕编写不同坐标计算代码(屏幕适配)Autolayout是一种自动布局 自ios7 Autolayout效率增加Autolayout功能比Autoresizing强大很多 黄色 控件的frame不匹配所添加的…

ant 执行多个构建文件

如果需要在一个构件文件中通过Ant命令去执行另一个Ant项目&#xff0c;或者说要执行本项目的子项目的构件文件。这时Ant这个核心任务就派上用场了。简单地说Ant任务的作用就相当于在命令行通过Ant命令执行构件文件。值得注意的是Ant任务依赖于target元素&#xff0c;需要在某个…

rockmq运维指令_RocketMQ 运维指令

1.1.控制台使用RocketMQ 提供有控制台及一系列控制台命令&#xff0c;用于管理员对主题&#xff0c;集群&#xff0c;broker 等信息的管理登录控制台首先进入RocketMQ 工程&#xff0c;进入/RocketMQ/bin在该目录下有个mqadmin 脚本查看帮助在mqadmin 下可以查看有哪些命令sh m…

第一次去四川的广东人是什么下场?

1 第一次去四川的广东人▼2 酒店&#xff1a;好的&#xff0c;下次把床头柜也粘地上▼3 朋友家楼下有一窝乌鸦重点是乌鸦窝是晾衣架做的那么问题来了......它们从哪里偷的那么多衣架&#xff1f;&#xff1f;▼4 没有妈咪编不出来的毛衣▼5 这简直一毛一样▼6 我今天非要…

我的C++开发工具链

工欲善其事&#xff0c;必先利其器。想要干好活&#xff0c;顺手的工具是必不可少的。来分享下我的C开发工具链。 平台&#xff1a;Windows 编译器&#xff1a;MSVC IDE&#xff1a;Visual Studio 版本控制&#xff1a;TortoiseGit 静态检查&#xff1a;VisualStudio_Scan 内存…

为什么 Dapper 的批量插入比我预期的要慢很多?

咨询区 kenwarner&#xff1a;我的项目中有一个批量插入的需求&#xff0c;我采用的是 Dapper 连接数据库&#xff0c;下面是我的代码。var members new List<Member>(); for (int i 0; i < 50000; i) {members.Add(new Member(){Username i.toString(),IsActive …

在java中写出html代码,在java里写html代码

在java里写html代码[2021-02-09 07:31:38] 简介:php去除nbsp的方法&#xff1a;首先创建一个PHP代码示例文件&#xff1b;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#xff1a;《…

append()与extend()

list函数append与extend的区别&#xff1a;前者的参数可以是任何类型&#xff0c;把元素加入到list中&#xff1b;后者的参数必须是list类型&#xff0c;把它和原list合并。 >>> a [1, 2, 3] >>> a.append([4, 5]) >>> a [1, 2, 3, [4, 5]] >&g…

简单的比较两数大小

#!/bin/bash#testecho "----- 比较两数大小-----";while (true) do{echo -n " 请输入a:";read a;echo -n " 请输入b:";read b;if [ $a -eq $b ]then echo "ab&#xff01;";elif [ $a -lt $b ]then echo "a 小于 b || $a < $b…

大咖来了!今年的 COSCon 主论坛你可以见到这些大咖

“ 点击蓝字 / 关注我们 ”| 作者&#xff1a;COSCon21 组委会| 编辑&#xff1a;王玥敏| 设计&#xff1a;朱亿钦COSCon21 主论坛已经开始了紧锣密鼓的筹备工作&#xff0c;大咖们走进影棚&#xff0c;录制主题演讲。那么在本次主论坛中&#xff0c;你都能见到哪些大咖呢&…

3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的你

全世界只有3.14 % 的人关注了爆炸吧知识宇宙深邃美丽&#xff0c;是黑夜的荧光&#xff0c;是夏天里冒着凉气的西瓜&#xff0c;总是诱人地勾起一代又一代人探索的欲望。对于宇宙思索与探索&#xff0c;人类的脚步从未停止。正是人类对宇宙的好奇&#xff0c;撑起了人类发展的大…