android - 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!!)
}
解决方案
推荐阅读
- umbraco - 仅在表格完成后在 Umbraco 中显示内容
- php - Share URL including URL parameter through Facebook
- reactjs - 在反应组件上使用 Laravel 项目 CSS
- c# - 运行总 C#
- python - 将列表中的元素弹出到列表中 [Python 3.x]
- webrtc - 如何使用 SimpleWebRTC 错误创建视频聊天应用程序网络
- powerbi - 具有自动刷新功能的 Power BI DirectQuery 报表
- css - 如何在 CSS 中制作离散宽度?
- wordpress - 优先顺序如何影响 WordPress 中的 add_action 和 do_action 链?
- c++ - 在 C++ 中放置派生的新基础子对象