上传文件的页面会以页面指定的编码格式对上传的数据进行编码,MultipartFile 在接收数据时会以系统默认的编码解码上传数据,如果页面编码与系统编码不一致,则会导致乱码。
方法一:在application.properties或者application.yaml添加如下参数配置
spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8
在yaml文件配置内容也是一样,仅仅是格式不一样,这边就不论述
方法二:定义一个mvc配置类,代码如下
@Configuration
public class CustomMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Bean
public HttpMessageConverter<String> responseBodyConverter() {
StringHttpMessageConverter converter = new StringHttpMessageConverter(
Charset.forName("UTF-8"));
return converter;
}
@Override
public void configureMessageConverters(
List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(responseBodyConverter());
}
@Override
public void configureContentNegotiation(
ContentNegotiationConfigurer configurer) {
configurer.favorPathExtension(false);
}
}
方法三:在上传文件的代码中,添加如下代码
String fileName = new String(file.getOriginalFilename().getBytes("ISO-8859-1"),"UTF-8");
如果以上三种方案都没办法解决,接下来就要思考下文件的上传流程,比如是否有通过网关之类的。接下来介绍当通过zuul来进行路由上传,文件中文名乱码问题的解决方式。
1、通过spring mvc的DispatcherServlet进行处理,这种方式对文件处理不是很好,会导致中文文件名乱码问题 2、通过ZuulServlet进行处理,这种方式中文文件名则不会乱码
zuul网关将所有带/zuul请求的请求都走Zuulservlet,不带zuul的请求都走spring mvc的Dispatchservlet。因此在请求上传文件url加上/zuul的前缀,即可解决中文文件名乱码问题
比如原来的文件请求路径为:localhost:8080/file/upload 修改为 localhost:8080/zuul/file/upload
这种方案比较适用于一开始就是以zuul作为网关。但如果zuul是项目已经运行一段时间后期才加上,而此时客户端访问上传的api url也已经固定成型,通过上面那种方式去改动,改动量可能会比较多。那有没有办法解决这个问题,答案当然是没有,怎么可能。。。所以推荐使用如下的方式
在zuul工程的application.yml添加如下配置
zuul:
servlet-path: /
采用这种方式,客户端不需要做任何改动
文件上传中文文件名乱码是一个很常遇见的问题,遇到这种常见问题,用常用的方式没办法解决时,可以梳理一下逻辑,理一下思路,可能就会有柳暗花明的效果