Okhttp MultipartBody encoding

Viewed 177

I use Okhttp 3.11 from android clients when making requests to the server. My parameter list and file name can contain Turkish characters, etc: ö,ı,ğ..

I use FormBody.Builder in requests where I send a parameter list. No problem here, like this:

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)

I want to do the same when I send both parameters and files. But I couldn't figure out how to give it to MultipartBody.Builder. Anyone have an idea? Thank u so much.

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!!)
}
0 Answers
Related