Okhttp请求头不支持中文,间接导致中文命名的文件上传会报错。
java.lang.IllegalArgumentException: Unexpected char 0x677e at 35 in Content-Disposition value: form-data; name="file"; filename= "松果测试.docx"
at okhttp3.Headers.checkValue(Headers.java:272)
at okhttp3.Headers.of(Headers.java:224)
at retrofit2.ParameterHandler$PartMap.apply(ParameterHandler.java:386)
at retrofit2.ParameterHandler$PartMap.apply(ParameterHandler.java:355)
at retrofit2.RequestFactory.create(RequestFactory.java:117)
at retrofit2.OkHttpCall.createRawCall(OkHttpCall.java:192)
解决方案
对文件名进行encode编码,修改如下。
for (Map.Entry<String, File> entry : fileSet.entrySet()) {
try {
//Okhttp请求头不支持中文,间接导致中文命名的文件上传会报错:java.lang.IllegalArgumentException:
//Unexpected char 0x677e at 35 in Content-Disposition value: form-data; name="file"; filename= "松果测试.docx"
//解决方案:对文件名进行encode编码,同时需要后端进行解码。
String fileName = URLEncoder.encode(entry.getValue().getName(), "UTF-8");
Log.i("UploadFile", "getRequestParams: " + fileName);
RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), entry.getValue());
queryParam.put(entry.getKey() + "\"; filename= \"" + fileName + "", requestBody);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
注意
注意跟后端沟通,编码的问题,必要时需要后端配合解码,因为可能存在如下问题:
- 上传后的文件名变成编码后的名字。
- 编码后文件名字可能会过长,导致后端数据库存储失败。