Retrofit

Android Retrofit Coroutine 實現多圖片/檔案上傳功能

Android Retrofit Coroutine 實現多圖片/檔案上傳功能

文章目錄

  1. 網路權限&導入Library
  2. 創建API的interface
  3. 創建RetrofitUtil
  4. 創建RetrofitHttpUpload(可方便用於添加key與value)
  5. 程式碼範例

1.網路權限&導入Library

Manifest
<uses-permission android:name="android.permission.INTERNET"/>
Gradle(Module)
dependencies {
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3'
}

2.創建API的interface

ApiService
@JvmSuppressWildcards
interface ApiService {
    @Multipart
    @POST("insert_image.php")
    suspend fun uploadImg(@PartMap params: Map<String, RequestBody>) : HttpResult
}
HttpResult
data class HttpResult(val status: String, val userMessage: String)

3.創建RetrofitUtil

class RetrofitUtils {
    private var retrofit: Retrofit = Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .client(getClient())
        .baseUrl("https://aa/bb/")
        .build()

    companion object {
        val instance: RetrofitUtils by lazy { RetrofitUtils() }
    }

    fun <T> getService(clazz: Class<T>): T {
        return retrofit.create(clazz)
    }

    private fun getClient(): OkHttpClient {
        val builder = OkHttpClient.Builder()
        val logInterceptor = HttpLoggingInterceptor()
        logInterceptor.level = HttpLoggingInterceptor.Level.BODY
        builder.addInterceptor(logInterceptor)
        return builder.build()
    }
}

4.創建RetrofitHttpUpload(可方便用於添加key與value)

class RetrofitHttpUpload {
    private val params = mutableMapOf<String, RequestBody>()

    fun addParameter(key: String, o: Any): RetrofitHttpUpload {
        if (o is String) {
            val body = RequestBody.create(MediaType.parse("text/plain;charset=UTF-8"), o)
            params[key] = body
        } else if (o is File) {
            val body = RequestBody.create(MediaType.parse("multipart/form-data;charset=UTF-8"), o)
            params[key + "\"; filename=\"" + o.name] = body
        }
        return this
    }

    fun builder() = params
}

5.程式碼範例

//取得圖片檔案
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.girl)
val file = File(externalCacheDir, "girl.jpg")
val ops = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ops)
ops.close()

//將資料加入RequestBody
val params = RetrofitHttpUpload().addParameter("file", file).builder()

CoroutineScope(Dispatchers.IO).launch {
    val httpResult = RetrofitUtils.instance.getService(ApiService::class.java).uploadImg(params)
    Log.e("GGG", httpResult.userMessage)
}

發表迴響