首页 > 解决方案 > Okhttp MultipartBody 编码

问题描述

在向服务器发出请求时,我使用来自 android 客户端的 Okhttp 3.11。我的参数列表和文件名可以包含土耳其字符等:ö,ı,ğ..

我在发送参数列表的请求中使用 FormBody.Builder。这里没问题,像这样:

val formBody = FormBody.Builder(Charset.forName("UTF-8"))
var encodedKey = URLEncoder.encode(map.key, "ISO-8859-9")
var encodedValue = URLEncoder.encode(map.value, "ISO-8859-9")
formBody.addEncoded(encodedKey, encodedValue)

当我发送参数和文件时,我想做同样的事情。但我不知道如何将它交给 MultipartBody.Builder。有人有想法吗?非常感谢你。

val multiPartBuilder = MultipartBody.Builder().setType(MultipartBody.FORM)
parameterList.forEach
{
    map ->
    var encodedKey = URLEncoder.encode(map.key, "ISO-8859-9")
    var encodedValue = URLEncoder.encode(map.value, "ISO-8859-9")
    multiPartBuilder.addFormDataPart(encodedKey, encodedValue)
}

val fileMapIt: Iterator<Map.Entry<String?, File?>> = filesMap!!.entries.iterator()
while (fileMapIt.hasNext()) {
    val currentFile = fileMapIt.next()
    if (currentFile.key != null && currentFile.value != null) {
        try {
            val encodedKey = URLEncoder.encode(currentFile.key, "ISO-8859-9")
            val encodedFileName = URLEncoder.encode(currentFile.value!!.name, "ISO-8859-9")
            multiPartBuilder.addFormDataPart(encodedKey, encodedFileName, RequestBody.create(getMediaType(currentFile.value!!.toURI()), currentFile.value!!))
        } catch (ex: Exception) {
        }
    }
}

var requestBody = multiPartBuilder.build()
var req = Request.Builder()
        .url("xxx")
        .post(requestBody)



private fun getMediaType(uriPrm: URI): okhttp3.MediaType? {
    val uri = Uri.parse(uriPrm.toString())
    val encodedUri = URLEncoder.encode(uri.toString())
    val fileExtension = MimeTypeMap.getFileExtensionFromUrl(encodedUri)
    var mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
            fileExtension.toLowerCase())
    return okhttp3.MediaType.parse(mimeType!!)
}

标签: androidcharacter-encodingmultipartform-dataokhttp

解决方案


推荐阅读