今天來談RetroFit在kotlin上怎麼實作圖片上傳的功能。
首先我們先來作幾個Retrofit的物件設定
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(上傳路徑, 檔案路徑, 檔案)