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(上傳路徑, 檔案路徑, 檔案)