原因:由于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();