大家好,关于实现高效文件上传:100行代码轻松实现OkHttp断点、分片、多文件上传功能很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
步骤及流程:
1、先把碎片分成块,把块分好!
每个块的总大小/价值
2. md5是文件的md5还是
全部上传并获取字节数组的md5。
3.网络请求的多个并发处理
并行:CountDownLatch 监听结果
使用多线程下载或上传时,由于多个线程执行时互不干扰,那么如何判断所有线程是否都执行完毕呢?线程池没有提供这样的方法,所以只能自己实现。一般可以设置一个整数标志位,初始化为0,当一个线程完成后,将此标志位加1,然后判断该标志位是否等于=任务数。如果相等的话说明所有任务都完成了,但是感觉就是这样。不是很优雅。 Java提供了一个计数器,我们可以使用CountDownLatch来判断是否所有任务都完成
Serial:每次循环就返回给我,就算成功了,那么20多个块,用serial的方法写同步请求,拿到一个再用另一个
4.进度计算(上传区块数*每个区块大小)
5.审判结束!您怎么知道所有内容都已上传?判断所有区块已经上传成功
6.重试机制添加计算计算
7. 取消上传有回调吗?是不是应该取消这个接口呢?
取消okhttp的回调
8.如何实现断点:一块一块的,上传的块不会再次上传
9、如果进程没有,怎么知道失败的次数和次数?
需要从后台返回数据。返回给我总的块数,已经完成的数量!还有每一个的数量!
/**
*多次上传
*/
有趣的multiPartUpload(fileAccess: FileAccess,totalChunks: Int,chunkNumber: Int): UploadResult {
var 上传结果=上传结果()
var uploadFile=文件(transferItemModel.path)
val 令牌=HttpRequestHelper.getToken()
var offset=chunkNumber.toLong() -1
BNLog.d(TAG, "offset:" + 偏移量)
var fileByte=fileAccess.getBlock(offset * FileAccess.CHUNK_SIZE, uploadFile)
var mutipartBody=MultipartBody.Builder()
mutipartBody.setType(MultipartBody.FORM)
mutipartBody.addFormDataPart("fileFolderId",transferItemModel.fileFolderId)
.addFormDataPart("uploadId", uploadId)
.addFormDataPart("totalChunks",totalChunks.toString())
.addFormDataPart("chunkNumber", chunkNumber.toString())
.addFormDataPart("isAutoComplete", 1.toString())
.addFormDataPart("标识符", MultiPartUtil.getBytesMd5(fileByte))
sumByte=文件字节.size +sumByte
BNLog.d(TAG, "multiPartUpload上传字节大小:" + fileByte.size +"当前上传总大小:" +sumByte)
var body=RequestBody.create(MultipartBody.FORM, fileByte)
mutipartBody.addFormDataPart("文件", uploadFile.name, body)
var request=Request.Builder().url(HttpPathEntity.HOST + HttpPathEntity.uploadPart.path)
.header("令牌", 令牌)
.header("sign", HttpRequestHelper.DEFAULT_SIGN)
.header("deviceId", DeviceUtils.androidID)
.header("时间戳", System.currentTimeMillis().toString())
.post(mutipartBody.build())。建造()
var client=OkHttpClient()
呼叫=client.newCall(请求)
尝试{
var 响应=call.execute()
var 响应体=响应.body()
if (response.isSuccessful) {
var content=response.body()?string()
var 结果=JSONObject(内容)
var resultCode=result.getInt("code")
var message=result.getString("message")
上传结果.code=结果代码
uploadResult.msg=消息
BNLog.d(TAG, "成功responseBody:" + responseBody + "content:" + 内容)
}别的{
BNLog.e(TAG, "失败响应Body:")
}
}catch(e: 异常){
}
返回上传结果
}
暂停有趣的uploadFile() {
BNLog.d(TAG, "uploadFile filePath=" +transferItemModel.path +"threadName:" + Thread.currentThread().name)
var fileAccess=FileAccess(transferItemModel.path)
var TotalChunks=fileAccess.chunkSize
var 重试次数=DEFAULT_RETRY_TIME
var isOk=false
var 成功计数=0
var TotalFileByteSize=MultiPartUtil.getFileByteSize(transferItemModel.path)
BNLog.e(TAG, "文件总长度:" +transferItemModel.fileSize +"读取总字节数:" +totalFileByteSize)
while (重试次数0 !isOk) {
for (iin 1 直到(totalChunks +1)) {
BNLog.d(TAG, "上传文件i=" + i)
if (i==TotalChunks) {
BNLog.d(TAG, "上传最后一个块:" + (totalChunks -1))
}别的{
//继续
}
var uploadResult=multiPartUpload(fileAccess,totalChunks,i)
if (uploadResult.code==UploadResult.SUCCESS_CODE) {//上传成功
成功计数++
var currentSize=successCount * FileAccess.CHUNK_SIZE //todo
var 进度=(100 * 当前大小/总文件字节大小).toInt()
BNLog.e(TAG, "progress:" + 进度)
如果(进度100){
进度=100
}
this.ossListener?onProgress(currentSize.toLong(),totalFileByteSize,进度)
}
//返回//测试
}
isOk=checkIsUploadSuccess(totalChunks, successCount)
isOk=true//测试
重试次数--
如果(是好的){
BNLog.d(TAG, "uploadFile全部上传成功")
休息
}
}
重试次数=0
//上传完成,判断是否有失败块
如果(是好的){
BNLog.e(TAG, "文件上传成功:" +transferItemModel.path)
this.ossListener?onSuccess()
this.ossListener?onReport(true)
var baonengId=UserCenterManage.getInstance(CloudServiceApp.getInstance()).getRefreshToken()
var uuid=transferItemModel.uuid
var uuidserver=baongId +"/" + uuid
syncFileMeta(transferItemModel.fileFolderId,transferItemModel.name,uuidserver,transferItemModel.fileSize.toString(),transferItemModel.md5,transferItemModel.mineType)
}别的{
this.ossListener?onFailure(999, "失败")
}
}
/***
* 是否所有区块都成功
*/
有趣的checkIsUploadSuccess(totalChunks: Int, successCount: Int): 布尔值{
if (成功计数=总块数) {
返回真
}
返回错误
}
okhttp相关:
问题:
1.okhttp取消请求有回调吗?
2.multipart/form-data是浏览器提交表单上传文件的一种方式。
.addFormDataPart("uploadfile", uploadfile, RequestBody.create(MediaType.parse("*/*"), file)) //第一个参数是传递给服务器的字段名,第二个参数是你自己的文件名,第二个参数是你自己的文件名。这三个MediaType.parse("*/*")其实和我们之前提到的类型是一样的
3. 为什么response.body().string()只能调用一次
我们可能习惯在获取到Response对象后,用response.body().string()打印日志,然后解析数据。然而我们发现第二次就直接抛出异常了。其实我们直接看源码的时候发现是通过源码获取的。到达字节流后,通过closeQuietly悄悄关闭它,这样我第二次通过源码读取时,就会得到流已关闭的异常。
publicfinal Stringstring() throws IOException{BufferedSource source=source();try{Charset charset=Util.bomAwareCharset(source,charset());returnsource.readString(charset);}finally{//这里资源悄悄地对Util 关闭了。安静地关闭(来源);}}
好了,文章到这里就结束啦,如果本次分享的实现高效文件上传:100行代码轻松实现OkHttp断点、分片、多文件上传功能和问题对您有所帮助,还望关注下本站哦!
【实现高效文件上传:100行代码轻松实现OkHttp断点、分片、多文件上传功能】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这也太牛了吧!竟然可以用100行代码实现这么多功能
有16位网友表示赞同!
看来学习OkHttp确实很有必要,以后可以用来开发类似的功能了
有12位网友表示赞同!
之前一直觉得上传文件的进度显示很麻烦,没想到这里有解决方案
有17位网友表示赞同!
断点上传和分片上传我都很需要,这个代码看起来很实用
有16位网友表示赞同!
Android开发里确实会有很多文件传输的需求,这方面确实挺方便
有5位网友表示赞同!
学习一下这个代码感觉可以提升我的Android开发能力
有13位网友表示赞同!
100行代码也太简单了!我还没学OkHttp呢
有7位网友表示赞同!
这样就不用担心上传文件的进度和耗时问题了
有5位网友表示赞同!
终于找到一个方便的Android文件上传框架,以后可以省很多时间
有19位网友表示赞同!
之前开发的时候遇到过这些功能需要自己实现的麻烦,现在看来很轻松
有10位网友表示赞同!
感觉这篇文章内容很有价值,让我对OkHttp有了更深的了解
有10位网友表示赞同!
多文件上传功能也很实用,平时在一些应用里经常会用到
有14位网友表示赞同!
这个代码分享真的太棒了,可以直接上手学习和使用
有9位网友表示赞同!
看来Android开发越来越便捷了,这些工具真是太赞了!
有20位网友表示赞同!
以后遇到类似的项目可以直接参考这个案例,省去了很多调试的时间
有5位网友表示赞同!
期待看到更多优秀的Android开发资源分享
有11位网友表示赞同!
这篇文章让我对OkHttp有了更深刻的理解,感谢作者开源贡献
有16位网友表示赞同!