iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 20
0

今天來談RetroFit在kotlin上怎麼實作圖片上傳的功能。

首先我們先來作幾個Retrofit的物件設定

  • ApiClient
  • APIFunction
  • ApiInterface

ApiClient

object ApiClient {
    var BASE_URL:String="your api path"
    val getClient: ApiInterface
        get() {
            val retrofit = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
            return retrofit.create(ApiInterface::class.java)

        }
}

這邊是設定Retrofit的Client端,包含要連結的URL,以及連線設定

APIFunction

class APIFunction {
        fun uploadImage(token: String, files : MultipartBody.Part, viewModel : GetProfileViewModel){

            val call: Call<DataModel.responseImage> = ApiClient.getClient.uploadImage(token,files)
            call.enqueue(object : Callback<DataModel.responseImage> {
                override fun onResponse(call: Call<DataModel.responseImage>?, response: Response<DataModel.responseImage>?) {
                    if (response!!.isSuccessful) { 
                        //200 成功時處理事件

                    } else {
                       //4XX 處理事件?
                    }
                }
                override fun onFailure(call: Call<DataModel.responseImage>?, t: Throwable?) {
                   //失敗時處理事件
                }
            })
        }
}

ApiInterface

interface ApiInterface {
    @Multipart
    @POST("Path")
    fun uploadImage(
        @Header("Authorization") token: String,
        @Part  file:MultipartBody.Part
    ): Call<DataModel.responseImage>
}

這邊要注意的是,選用@Multipart,來宣告說我們要用MultiPart的方式來作檔案上傳。

所以下方要用@Part來作接收端。
這邊是用@Part file:MultipartBody.Part的方法,所以當我們在實作時,記得宣告同類型的物件。

實作

var file =File(path)
var requestFile = RequestBody.create(MediaType.parse("image/*"), file)

var body: MultipartBody.Part =
    MultipartBody.Part.createFormData("files[]", file.getName(), requestFile)
viewModel.setUploadImage(token, body)

這邊注意到

RequestBody.create(MediaType.parse("image/*"), file)

由於這次我們要上傳的是圖片,所以MediaType宣告為image/*,
如果要上傳的是檔案,就要選擇multipart/form-data。

然後是

var body: MultipartBody.Part =
    MultipartBody.Part.createFormData("files[]", file.getName(), requestFile)

我們宣告了MultipartBody.Part類型來承接RequestBody物件,並用createFormData表示用content-type: multipart/form-data的處理方式。

注意createFormData(上傳路徑, 檔案路徑, 檔案)


上一篇
當Activity宣告為singleTask時,從不同地方要傳資料就要使用onNewIntent覆寫
下一篇
Retrofit 使用GET還要帶Body? 帶了還要被ERROR?
系列文
跟Kotlin一起來聊Android元件 或許還有應用,或許還有一些資訊雜談30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言