最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android使用OkHttp上傳圖片的實例代碼

 更新時間:2017年07月01日 14:26:39   作者:Goach  
本篇文章主要介紹了Android使用OkHttp上傳圖片的實例代碼,這里整理了相關(guān)的代碼,有興趣的可以了解一下

簡介

上傳圖片是一個APP的常見功能,可以是通過OOS上傳到阿里云,也可以直接上傳到Server后臺,OOS有提供相應(yīng)的SDK,此處忽略。下面通過OkHttp來實現(xiàn)圖片的上傳

代碼

直接上代碼UploadFileHelper.kt

object UploadFileHelper {
 //--------ContentType
 private val MEDIA_OBJECT_STREAM = MediaType.parse("multipart/form-data")
 //--------上傳延時時間
 private val WRITE_TIME_OUT:Long = 50
 private val mOkHttpClient by lazy { OkHttpClient() }
 //------基本參數(shù)----------
 val version = AppConstant.API_VERSION
 val platform = AppConstant.API_PLATFORM
 val methodName = AppConstant.API_UPLOADFILE_METHOD
 val token = ignoreException("") { UserModel.token() }
 val userId = ignoreException(0) { UserModel.id() }
 //------------------------
 //不帶參數(shù)同步上傳文件
 fun syncUploadFile(actionUrl: String = "",file: File,maxW: Int = 256,maxH: Int = 256):String?{
  val uploadFile = optionFileSize(file,maxW,maxH,null)
  if(uploadFile!=null){
   val response = createNoParamsOkHttpCall(actionUrl,uploadFile).execute()
   if(uploadFile.exists())
    uploadFile.delete()
   return getResponseToPath(response.body()!!.string())
  }
  return null
 }
 //不帶參數(shù)異步上傳文件
 fun asyncUploadFile(actionUrl:String = "", file: File,maxW: Int = 256,maxH: Int = 256,
      uploadCallBackListener: UploadCallBackListener? = null){
  val uploadFile = optionFileSize(file,maxW,maxH,uploadCallBackListener)
  if(uploadFile!=null)
  createNoParamsOkHttpCall(actionUrl,uploadFile).enqueue(object: Callback{
   override fun onFailure(c: Call, e: IOException) {
    uploadCallBackListener?.onUploadFailure(e.toString())
   }
   override fun onResponse(c: Call, response: Response) {
    if(uploadFile.exists())
    uploadFile.delete()

     uploadCallBackListener?.onUploadSuccess(getResponseToPath(response.body()!!.string()))
    response.body()!!.close()
   }
  })
 }
 //帶參數(shù)同步上傳文件
 fun syncParamsUploadFile(actionUrl: String= "",file: File,params:HashMap<String,Any>,
      maxW: Int = 256,maxH: Int = 256):String?{
  val uploadFile = optionFileSize(file,maxW,maxH,null)
  if(uploadFile!=null){
   params.put("filename",uploadFile)
   val response = createParamsOkHttpCall(actionUrl,params,null,false).execute()
   if(uploadFile.exists())
    uploadFile.delete()
   return getResponseToPath(response.body()!!.string())
  }
  return null
 }
 //帶參數(shù)異步上傳文件
 fun asyncParamsUploadFile(actionUrl: String= "",file: File,params:HashMap<String,Any>,maxW: Int = 256,maxH: Int = 256,
      uploadCallBackListener: UploadCallBackListener? = null, isProgress:Boolean = true){
  val uploadFile = optionFileSize(file,maxW,maxH,uploadCallBackListener)
  if(uploadFile!=null){
   params.put("filename",uploadFile)
   createParamsOkHttpCall(actionUrl,params,uploadCallBackListener,isProgress).enqueue(object :Callback{
    override fun onFailure(c: Call, e: IOException) {
     uploadCallBackListener?.onUploadFailure(e.toString())
    }
    override fun onResponse(c: Call, response: Response) {
      if(uploadFile.exists())
      uploadFile.delete()
     uploadCallBackListener?.onUploadSuccess(getResponseToPath(response.body()!!.string()))
     response.body()!!.close()
    }
   })
  }
 }
 //------創(chuàng)建一個沒有帶參數(shù)的Call
 fun createNoParamsOkHttpCall(actionUrl: String,file: File):Call{
  val requestUrl = "${AppConstant.HOST}/$actionUrl"
  val requestBody = RequestBody.create(MEDIA_OBJECT_STREAM,file)
  val request = Request.Builder().url(requestUrl).post(requestBody).build()
  return mOkHttpClient.newBuilder().writeTimeout(WRITE_TIME_OUT,TimeUnit.SECONDS).build().newCall(request)
 }
 //------創(chuàng)建一個帶參數(shù)的Call
 fun createParamsOkHttpCall(actionUrl: String,params:Map<String,Any>,
        uploadCallBackListener: UploadCallBackListener? = null,
        isProgress:Boolean = true):Call{
  //-----AppConstant.HOST 上傳圖片的Server的BASE_URL http://xxx.com
  val requestUrl = "${AppConstant.HOST}/$actionUrl"
  val builder = MultipartBody.Builder()
  builder.setType(MultipartBody.FORM)
  val newParams = mutableMapOf(
    "version" to version,
    "platform" to platform,
    "methodName" to methodName,
    "token" to token,
    "user_id" to userId)
  newParams.putAll(params)
  newParams.forEach( action = {
   if(it.value is File){
    builder.addFormDataPart(it.key, (it.value as File).name,
    if(isProgress) createProgressRequestBody(MEDIA_OBJECT_STREAM!!,(it.value as File),uploadCallBackListener)
    else RequestBody.create(null, (it.value as File)))
   }else{
    builder.addFormDataPart(it.key,it.value.toString())
   }
  })
  val body = builder.build()
  val request = Request.Builder().url(requestUrl).post(body).build()
  return mOkHttpClient.newBuilder().writeTimeout(WRITE_TIME_OUT,TimeUnit.SECONDS).build().newCall(request)

 }

 //創(chuàng)建帶進度RequestBody
 fun createProgressRequestBody(contentType:MediaType,file:File,
         uploadCallBackListener: UploadCallBackListener? = null):RequestBody{
  return object:RequestBody(){
   override fun contentType(): MediaType = contentType
   override fun contentLength() = file.length()
   override fun writeTo(sink: BufferedSink) {
    ignoreException {
     val source = Okio.source(file)
     val buf = Buffer()
     val remaining = contentLength()
     var current: Long = 0
     var readCount: Long = source.read(buf, 2048)
     while (readCount != -1L) {
      sink.write(buf, readCount)
      current += readCount
      uploadCallBackListener?.onUploadProgress(current,remaining)
      readCount = source.read(buf, 2048)
     }

    }
   }
  }
 }
 //根據(jù)圖片大小簡單壓縮
 fun optionFileSize(file: File,maxW:Int,maxH:Int,uploadCallBackListener: UploadCallBackListener?):File?{
  try {
   val uploadFile = File(AppBridge.AppContext().externalCacheDir, file.hashCode().toString())
   ImageUtils.resize(file, maxW, maxH, uploadFile)
   return uploadFile
  } catch (e: Exception) {
   uploadCallBackListener?.onUploadFailure("壓縮圖片失敗")
   return null
  }

 }
 //解析Server返回的數(shù)據(jù)獲取圖片路徑,
 /*
  {"code":200,"msg":"上傳成功","data":{"path":""}}
 */
 fun getResponseToPath(response:String):String{
  val dataJsonObj = JSONObject(response).get("data") as JSONObject
  return dataJsonObj.get("path") as String
 }
 //回調(diào)方法
 interface UploadCallBackListener{
  fun onUploadFailure(error:String)
  fun onUploadProgress(currentSize:Long,totalSize:Long)
  fun onUploadSuccess(path:String)
 }
}
inline fun <T> ignoreException(def: T, f: () -> T): T {
 try {
  return f()
 } catch(e: Exception) {
  Timber.e(e, "")
  return def
 }
}

最后根據(jù)是否要帶參數(shù)、同步或異步調(diào)用其中對應(yīng)的方法可以了

syncUploadFile(xxx)

asyncUploadFile(xxx)

syncParamsUploadFile(xxx)

asyncParamsUploadFile(xxx)

總結(jié)

首先根據(jù)是否要帶參數(shù)上傳,如果不帶參數(shù)上傳,直接創(chuàng)建RequestBody;如果帶參數(shù)上傳,創(chuàng)建MultipartBody.Builder(),然后把所有參數(shù)addFormDataPart進去,其中addFormDataPart方法有個RequestBody參數(shù)通過是否要監(jiān)聽進度創(chuàng)建,如果需要進度,需重寫RequestBody的writeTo()方法,如果不監(jiān)聽進度,直接創(chuàng)建RequestBody,最后builder.build()得到RequestBody

通過上步驟得到的RequestBody以及上傳圖片的Server路徑,可以配置出一個Request對象。

把Request對象通過.newCall(request)配置在OkHttpClient得到Call對象

最后Call調(diào)用同步.execute()或者異步.enqueue(callBack),在回調(diào)里面處理返回的數(shù)據(jù)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android自定義view實現(xiàn)帶header和footer的Layout

    Android自定義view實現(xiàn)帶header和footer的Layout

    這篇文章主要介紹了Android自定義view實現(xiàn)帶header和footer的Layout,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • Android NavigationBar問題處理的方法

    Android NavigationBar問題處理的方法

    本篇文章主要介紹了Android NavigationBar問題處理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Android調(diào)用堆棧跟蹤實例分析

    Android調(diào)用堆棧跟蹤實例分析

    這篇文章主要介紹了Android調(diào)用堆棧跟蹤的方法,以實例形式較為詳細(xì)的分析了Android錯誤信息分析的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Android直播app送禮物連擊動畫效果(實例代碼)

    Android直播app送禮物連擊動畫效果(實例代碼)

    最近在做公司的直播項目,需要實現(xiàn)一個觀看端連擊送禮物的控件,下面給大家分享實例代碼,需要的的朋友參考下吧
    2017-07-07
  • Android模糊處理實現(xiàn)圖片毛玻璃效果

    Android模糊處理實現(xiàn)圖片毛玻璃效果

    這篇文章主要介紹了Android模糊處理實現(xiàn)圖片毛玻璃效果,需要的朋友可以參考下
    2016-02-02
  • Android中手機錄屏并轉(zhuǎn)換GIF的兩種方式

    Android中手機錄屏并轉(zhuǎn)換GIF的兩種方式

    本文主要介紹了android中手機錄屏并轉(zhuǎn)換GIF的兩種方式,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • Android客戶端與服務(wù)端交互

    Android客戶端與服務(wù)端交互

    這篇文章主要為大家詳細(xì)介紹了Android客戶端與服務(wù)端交互之登陸示例,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Android編程之繪圖canvas基本用法示例

    Android編程之繪圖canvas基本用法示例

    這篇文章主要介紹了Android編程之繪圖canvas基本用法,結(jié)合實例形式分析了Android canvas繪圖的相關(guān)方法與使用技巧,需要的朋友可以參考下
    2017-09-09
  • Android開發(fā)vsts?agent支持自定義task過程詳解

    Android開發(fā)vsts?agent支持自定義task過程詳解

    這篇文章主要介紹了Android開發(fā)vsts?agent支持自定義task過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Android 自定義標(biāo)題欄背景

    Android 自定義標(biāo)題欄背景

    最近在做android項目,需要做一個自定義的標(biāo)題欄(操作欄)。去網(wǎng)上找了很多demo,發(fā)現(xiàn)都有很多問題。例如使用自定義的style。下面來分享下個人最終的解決方案吧
    2016-01-01

最新評論

兴安县| 固阳县| 清流县| 平湖市| 二连浩特市| 苍溪县| 康乐县| 黔西县| 梁山县| 绩溪县| 微博| 枣庄市| 文水县| 永和县| 长垣县| 随州市| 开原市| 铜梁县| 安溪县| 永登县| 遂溪县| 定州市| 宜宾县| 邹城市| 彭水| 新绛县| 堆龙德庆县| 延吉市| 万载县| 太康县| 铁岭县| 高唐县| 凤台县| 承德市| 温州市| 时尚| 台北市| 卫辉市| 偃师市| 望江县| 开封县|