天天看点

解决okhttp上传中文文件名的时候检验不通过的问题

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

继续阅读