解决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();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值