本篇文章给大家分享的是有关如何在Android中利用OkHttp实现一个图片上传功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现方法如下:object UploadFil
本篇文章给大家分享的是有关如何在Android中利用OkHttp实现一个图片上传功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
实现方法如下:
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() } //------基本参数---------- 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() } //------------------------ //不带参数同步上传文件 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 } //不带参数异步上传文件 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() } }) } //带参数同步上传文件 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 } //带参数异步上传文件 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() } }) } } //------创建一个没有带参数的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) } //------创建一个带参数的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) } //创建带进度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) } } } } } //根据图片大小简单压缩 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返回的数据获取图片路径, fun getResponseToPath(response:String):String{ val dataJSONObj = jsONObject(response).get("data") as JSONObject return dataJsonObj.get("path") as String } //回调方法 interface UploadCallBackListener{ fun onUploadFailure(error:String) fun onUploadProgress(currentSize:Long,totalSize:Long) fun onUploadSuccess(path:String) }}
--结束END--
本文标题: 如何在Android中利用OkHttp实现一个图片上传功能
本文链接: https://www.lsjlt.com/news/222444.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-12
2024-05-12
2024-05-12
2024-05-12
2024-05-12
2024-05-12
2024-05-12
2024-05-12
2024-05-12
2024-05-12
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0