JAVA踩坑记录spring-cloud-zuul文件上传中文名乱码

Posted Ethan_LiYan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA踩坑记录spring-cloud-zuul文件上传中文名乱码相关的知识,希望对你有一定的参考价值。

1.【现象】

①从request域中获取多文件:

List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file[]"); 

②获取单个文件名:

String name = multipartFile.getOriginalFilename();  //此时name=????全是问号,还非乱码

③无效的解决方法:

String fileName = new String(name.getBytes(),"utf-8"); //什么ios8859-1什么的都是无用的,或是其他转UTF-8都是无用的

2.【原因】

①先找官网文档(谷歌翻译如下)

②详细原因,找源码

a)在ServletDetectionFilter过滤中

Spring Cloud Zuul现在对于上传文件有两种处理方式,一种是用spring mvc,另一种是zuulServlet。spring mvc对文件处理不是很好,会导致乱码问题,zuulServlet则不会。

在zuul的过滤器中,有一个pre的过滤器 ServletDetectionFilter,他的执行顺序是-3,也是最先执行的过滤器,在这个过滤器中,有这么一段代码:

在这个方法中,IS_DISPATCHER_SERVLET_REQUEST_KEY为false就会用ZuulServlet处理。如果没加/zuul前缀,IS_DISPATCHER_SERVLET_REQUEST_KEY就会置为true,就会用spring mvc上传

b)再看ServletDetectionFilter过滤器

      这个过滤器的用处主要是处理表单数据,包括多部分表单数据(即文件)上传

源码描述:

Implementation of @link HttpMessageConverter that can handle form data, including multipart form data (i.e. file uploads).

c)病根就在这里

3.【解决办法】

看官方文档 :

第一种解决方案,api接口前面 /zuul:

在不修改zuul默认配置参数的情况下,在上传文件的请求路径之前添加字符串“zuul”声明此请求被ZuulServlet处理。

       例如在当前代码下,请求路径是:

       localhost:8080/up/upload

       那么采用方案一解决中文乱码的请求路径就是:

       localhost:8080/zuul/up/upload

       经过测试,中文乱码问题成功解决。

如果第一种方式,显示404,尝试第二种解决方案,改zuul的配置文件:

       在zuul的配置文件中添加一个如下的属性:

       zuul.servlet-path=/

 

 

 

以上是关于JAVA踩坑记录spring-cloud-zuul文件上传中文名乱码的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Cloud-Zuul-网关配置

JAVA踩坑记录Feign调用服务时,get请求参数异常

Flink Java踩坑记录(gegge1.10.0)

Flink Java踩坑记录(gegge1.10.0)

Java ArrayList 踩坑记录

Java ArrayList 踩坑记录