小言_互联网的博客

日常水文章之安卓文件上传(okhttpclien)

259人阅读  评论(0)

不废话直接先导包:

这里我是用的jar包,你们可以网上直接找最新的,也可以找跟我版本差不多的


  
  1. fun Upload(uploadFilePath: String?,
  2. Uri: String?,
  3. mMediaType: String?,
  4. mResponseCallback: ResponseCallback) {
  5. Log.i( "TAG", "uploadFilePath:" + uploadFilePath)
  6. Log.i( "TAG", "Uri:" + Uri)
  7. val uploadFile = File(uploadFilePath)
  8. val client = OkHttpClient().newBuilder()
  9. .readTimeout( 100, TimeUnit.SECONDS) //读取超时
  10. .connectTimeout( 60, TimeUnit.SECONDS) //连接超时
  11. .writeTimeout( 60, TimeUnit.SECONDS) //写入超时
  12. .connectionPool(ConnectionPool( 32,
  13. 5, TimeUnit.MINUTES)) //自定义连接池最大空闲连接数和等待时间大小,否则默认最大5个空闲连接
  14. .build()
  15. val mediaType = MediaType.parse(mMediaType)
  16. val requestBody = RequestBody.create(mediaType, uploadFile) //把文件与类型放入请求体
  17. val body = MultipartBody.Builder()
  18. .setType(MultipartBody.FORM)
  19. .addFormDataPart( "file", uploadFile.name, requestBody)
  20. .build()
  21. var request: Request? = null
  22. request = Request.Builder()
  23. .url(Uri)
  24. .post(body)
  25. .build()
  26. var call: Call? = null
  27. try {
  28. call = client.newCall(request)
  29. call.enqueue( object : Callback {
  30. override fun onFailure(call: Call?, e: IOException) {
  31. Log.i( "TAG", "failure upload!" + e.message)
  32. mResponseCallback.onException( "上传失败..." + e.message)
  33. }
  34. @Throws(IOException::class)
  35. override fun onResponse(call: Call?, response: Response) {
  36. mResponseCallback.onResponse(response.body()!!.string())
  37. }
  38. })
  39. } catch (e1: IOException) {
  40. e1.printStackTrace()
  41. }
  42. }

 代码很简单,我先介绍一下参数

uploadFilePath :文件的上传地址,绝对地址,注意安卓10.0的文件权限
Uri:服务器接收文件的地址
mMediaType:资源类型,这个可以百度得到,比如视频是 video/mp4
mResponseCallback:是一个回调

   
  1. interface ResponseCallback {
  2. fun onResponse(string: String)
  3. fun onError(httpCode: Int?, errorBody: String?, throwable: Throwable?)
  4. fun onException(string: String)
  5. fun UploadProBar()
  6. }

这个类看你们自己的交互可加可不加!

注意:我在使用这个类传大文件的时候出现通道破裂问题,但是小文件不会,这个问题是因为服务器默认限制了上传文件的大小 

扩展:有些服务器会有token一说,那么如果有token的话,我们的配置就是这样的:

request = Request.Builder()
        .url(Uri)
        .post(body)
        .header(TokenName, Token) //后台所需要的token
        .build()

 tokenName是token的别名,Token就是服务器需要的token,看情况而定!


转载:https://blog.csdn.net/qq_36333309/article/details/111831765
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场