原因:由于okhttp中有个checkName的函数会校验header的值导致的
解决方案:添加拦截器,利用反射机制修改文件的头的内容,
关在在于自己先找打所需要的头再那个对象里面,然后逐层解套去修改值
参考代码如下:
client = new OkHttpClient.Builder()
.writeTimeout(30,TimeUnit.SECONDS)
.connectTimeout(30,TimeUnit.SECONDS)
.readTimeout(30,TimeUnit.SECONDS)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
//是不是上传文件的类,如果是上传文件的类才这样操作,上传文件使用的就是MultipartBody
if(request.body() instanceof MultipartBody){
MultipartBody multipartBody = (MultipartBody) request.body();
try{
Field field = multipartBody.getClass().getDeclaredField("parts");
field.setAccessible(true);
List<MultipartBody.Part> object = (List<MultipartBody.Part>) field.get(multipartBody);
//目标需要修改的part
MultipartBody.Part filenamePart = object.get(1);
String fileNameHeaders = GsonUtil.ObjectToJson(filenamePart.headers());
//查找header里面中文头参数的位置进行修改
int fileIndex = fileNameHeaders.indexOf("filename\\u003d\\\"");
int png = fileNameHeaders.indexOf(".pdf");//根据实际上传的文件名来确定
if(fileIndex == -1 || png == -1){
//直接跳出返回
Response response = chain.proceed(request);
return response;
}
String fileNameURLEncodeStr = fileNameHeaders.substring(fileIndex+"filename\\u003d\\\"".length(),png);
String fileNameURLDecodeStr = URLDecoder.decode(fileNameURLEncodeStr,"utf-8");
// System.out.println("fileNameURLEncodeStr:"+fileNameURLEncodeStr);
// System.out.println("fileNameURLDecodeStr:"+fileNameURLDecodeStr);
//修改文件头
fileNameHeaders = fileNameHeaders.replace(fileNameURLEncodeStr,fileNameURLDecodeStr);
Headers filenamePartHeader = GsonUtil.JsonToObject(fileNameHeaders,
new TypeToken<Headers>(){}.getType());
//置换filenamePart的header
Field headerField = filenamePart.getClass().getDeclaredField("headers");
headerField.setAccessible(true);
headerField.set(filenamePart,filenamePartHeader);
// System.out.println(fileNameHeaders);
field.set(multipartBody,object);
}catch(Exception e){
// e.printStackTrace();
MyLog.info("反射解决文件名发生异常错误:"+e.toString());
}
}
Response response = chain.proceed(request);
return response;
}
})
.build();