AndroidはOkHttpを使って画像のインスタンスコードをアップロードします。
概要
アップロード画像はAPPの一般的な機能です。OOSを通じてアリクラウドにアップロードすることもできます。Serverバックグラウンドに直接アップロードすることもできます。OOSは対応するSDKを提供します。ここで無視します。以下はOkHttpを通じて画像のアップロードを実現します。
コード
直接コードUploadFileHelper.kt
まずパラメータを持ってアップロードするかどうかによって、パラメータを持ってアップロードしないなら、直接Request Bodyを作成します。パラメータをアップロードする場合は、MultiiprtBody.Buildder()を作成し、すべてのパラメータaddFormDataPartを入れます。addFormDataPartメソッドはRequest Bodyパラメータがあります。進捗状況を監視するかどうかは、Request BodyのwriteTo()方法を書き換えてください。
上記のステップで得られたRequest Bodyと画像をアップロードするServerパスは、Requestオブジェクトを構成することができる。
Requestオブジェクトを通過します。newCallをOkHttpClientに配置して、Callオブジェクトを獲得します。
最後にCallは同期・execute()または非同期・enqueue(calBack)を呼び出し、コールバックの中で返したデータを処理します。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
アップロード画像はAPPの一般的な機能です。OOSを通じてアリクラウドにアップロードすることもできます。Serverバックグラウンドに直接アップロードすることもできます。OOSは対応するSDKを提供します。ここで無視します。以下はOkHttpを通じて画像のアップロードを実現します。
コード
直接コード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() }
//------ ----------
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 ,
/*
{"code":200,"msg":" ","data":{"path":""}}
*/
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)
}
}
inline fun <T> ignoreException(def: T, f: () -> T): T {
try {
return f()
} catch(e: Exception) {
Timber.e(e, "")
return def
}
}
最後に、パラメータ、同期、または非同期に基づいて、対応する方法を呼び出すことができます。
syncUploadFile(xxx)
asyncUploadFile(xxx)
syncParamsUploadFile(xxx)
asyncParamsUploadFile(xxx)
締め括りをつけるまずパラメータを持ってアップロードするかどうかによって、パラメータを持ってアップロードしないなら、直接Request Bodyを作成します。パラメータをアップロードする場合は、MultiiprtBody.Buildder()を作成し、すべてのパラメータaddFormDataPartを入れます。addFormDataPartメソッドはRequest Bodyパラメータがあります。進捗状況を監視するかどうかは、Request BodyのwriteTo()方法を書き換えてください。
上記のステップで得られたRequest Bodyと画像をアップロードするServerパスは、Requestオブジェクトを構成することができる。
Requestオブジェクトを通過します。newCallをOkHttpClientに配置して、Callオブジェクトを獲得します。
最後にCallは同期・execute()または非同期・enqueue(calBack)を呼び出し、コールバックの中で返したデータを処理します。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。