jeasonlzy / okhttp-OkGo

OkGo - 3.0 震撼来袭,该库是基于 Http 协议,封装了 OkHttp 的网络请求框架,比 Retrofit 更简单易用,支持 RxJava,RxJava2,支持自定义缓存,支持批量断点下载管理和批量上传管理功能
Apache License 2.0
10.6k stars 2.55k forks source link

上传的文件带有中文名称报错 #842

Open 1141704427 opened 5 years ago

1141704427 commented 5 years ago

上传的文件带有中文名称,被okhttp3 库里面的 okhttp3.Headers.java 类中的checkNameAndValue方法抛出异常,okgo是否有处理中文编码的方法 java.lang.IllegalArgumentException: Unexpected char 0x7f8e at 35 in Content-Disposition value: form-data; name="files";filename="测试-(117)_&_9993a332-8842-400e-a380-24a6eb01da88.jpg"

Howard-mo commented 5 years ago

我也遇到这个问题,怎么解决呢?有谁解了吗?

readmycodetanos commented 5 years ago

像我这样的大好人,果断上传解决方案

在HttpUtils 中替换如下代码,

/* 生成类似表单的请求体 / public static RequestBody generateMultipartRequestBody(HttpParams params, boolean isMultipart) { if (params.fileParamsMap.isEmpty() && !isMultipart) { //表单提交,没有文件 FormBody.Builder bodyBuilder = new FormBody.Builder(); for (String key : params.urlParamsMap.keySet()) { List urlValues = params.urlParamsMap.get(key); for (String value : urlValues) { bodyBuilder.add(key, value); } } return bodyBuilder.build(); } else { //表单提交,有文件 MultipartBody.Builder multipartBodybuilder = new MultipartBody.Builder().setType(MultipartBody.FORM); //拼接键值对 if (!params.urlParamsMap.isEmpty()) { for (Map.Entry<String, List> entry : params.urlParamsMap.entrySet()) { List urlValues = entry.getValue(); for (String value : urlValues) { multipartBodybuilder.addFormDataPart(entry.getKey(), value); } } } //拼接文件 for (Map.Entry<String, List> entry : params.fileParamsMap.entrySet()) { List fileValues = entry.getValue(); for (HttpParams.FileWrapper fileWrapper : fileValues) { RequestBody fileBody = RequestBody.create(fileWrapper.contentType, fileWrapper.file); try { String fileName= URLEncoder.encode(fileWrapper.fileName.substring(0,fileWrapper.fileName.lastIndexOf(".")),"utf-8"); fileName+= fileWrapper.fileName.substring(fileWrapper.fileName.lastIndexOf(".")); multipartBodybuilder.addFormDataPart(entry.getKey(),fileName, fileBody); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } return multipartBodybuilder.build(); } }

解释: addFormDataPart(key,filename,filebody) 中 filename 需要encode

readmycodetanos commented 5 years ago

@1141704427 @Howard-mo