Android Retrofit2 上傳文件攜帶參數

ApiService 中的寫法:

    @POST("/upload/xxx")
    fun xxxMethod(
            @Body body: RequestBody
    ): Observable<BaseResp>

PS: 之前有印象好像可以通過 @Part 註解來一起上傳,後來項目中又不好使了,不知道哪裏的問題。

上面接口中傳遞的是 Body 格式,下面來看一下生成 body 的方法:

    fun generateUploadBody(file: File, fileKey: String, keyValues: HashMap<String, String>.() -> Unit = {}): RequestBody {

        val body = RequestBody.create(MediaType.parse("multipart/form-data"), file)
        // EncodeUtil.urlEncodeUtf8  這裏是爲了避免中文文件名引起的亂碼問題。
        val part=  MultipartBody.Part.createFormData(fileKey, EncodeUtil.urlEncodeUtf8(file.name), body)

        val params = HashMap<String, String>().apply(keyValues)

        val mulBody = MultipartBody.Builder().apply {
            addPart(part)

            params.map {
                addFormDataPart(it.key, it.value)
            }
        }.build()
        return mulBody
    }

注意:fileKey 也就是服務端用來接收這個文件的 Key . 就跟我們傳遞普通參數的 Key 是一個意思。

下面是用法:

val body = HttpUtil.generateUploadBody(file, "photo") {
// 這裏是給 Map 添加值
	put("userName", userName)
	...
}
.... 把 body 傳給接口。

這裏都是以 Kotlin 語法寫的,如有需要,自行調整 Java 語法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章