You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OkHttp问题:POST请求无法修改字符集的技术咨询

解决OkHttp提交带罕见字符集文件名的表单问题

OkHttp的addFormDataPart(name, filename, data)方法确实硬编码了文件名的UTF-8编码,没法直接指定罕见字符集。要解决这个问题,你需要手动构建MultipartBody.Part,通过自定义Content-Disposition头来指定文件名的字符集,遵循RFC 5987的标准格式。

具体实现代码

// 替换为你的目标字符集和文件名
val targetCharset = Charset.forName("rareCharset")
val originalFilename = "带罕见字符的文件名"
val name = "表单字段名"
val data = // 你的文件数据(比如File、ByteArray等)

// 按照目标字符集编码文件名
val encodedFilename = URLEncoder.encode(originalFilename, targetCharset.name())

// 构造符合RFC 5987的Content-Disposition头
val dispositionHeader = "form-data; name=\"$name\"; filename*=${targetCharset.name()}''$encodedFilename"

// 构建文件对应的RequestBody,可根据文件类型调整媒体类型
val fileRequestBody = data.toRequestBody("application/octet-stream".toMediaType())

// 创建自定义的表单部分
val customFormPart = MultipartBody.Part.create(
    Headers.headersOf("Content-Disposition", dispositionHeader),
    fileRequestBody
)

// 组装Multipart请求体
val multipartRequest = MultipartBody.Builder()
    .setType(MultipartBody.FORM)
    .addPart(customFormPart)
    // 添加其他表单字段(比如你之前用addPart处理的普通字段)
    .build()

关键说明

  • 这里使用了RFC 5987定义的filename*格式,格式为filename*=charset''encoded-filename,其中charset是你需要的罕见字符集,encoded-filename是经过URL编码后的文件名(确保特殊字符能正确传输)。
  • 服务器端需要支持RFC 5987的filename*解析规则,这是HTTP标准的一部分,主流后端框架(如Spring、Express等)都已支持。
  • 对比你之前处理普通表单字段的方式,这个方案专门针对带文件名的文件上传场景,绕过了OkHttp硬编码UTF-8的限制。

内容的提问来源于stack exchange,提问作者sdml

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:42:39