Android Okhttp上传文件报错:Unexpected char 0x677e at 35 in Content-Disposition value

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();
                }
            }

注意

注意跟后端沟通,编码的问题,必要时需要后端配合解码,因为可能存在如下问题:

  1. 上传后的文件名变成编码后的名字。
  2. 编码后文件名字可能会过长,导致后端数据库存储失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值