如何破解springboot/springcloud上传中文文件名乱码魔咒

上传文件名为中文的文件会乱码缘由

上传文件的页面会以页面指定的编码格式对上传的数据进行编码,MultipartFile 在接收数据时会以系统默认的编码解码上传数据,如果页面编码与系统编码不一致,则会导致乱码。

springboot/springcloud上传中文文件名乱码解决方法

方法一:在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来进行路由上传,文件中文名乱码问题的解决方式。

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: /

采用这种方式,客户端不需要做任何改动

总结

文件上传中文文件名乱码是一个很常遇见的问题,遇到这种常见问题,用常用的方式没办法解决时,可以梳理一下逻辑,理一下思路,可能就会有柳暗花明的效果

原文发布于微信公众号 - Linyb极客之路(gh_c420b2cf6b47)

原文发表时间:2018-07-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿DD

Logback中使用TurboFilter实现日志级别等内容的动态修改

可能看到这个标题,读者会问:要修改日志的级别,不是直接修改log.xxx就好了吗?为何要搞那么复杂呢?

1112
来自专栏fixzd

Dubbo项目入门

Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 它的特性...

1282
来自专栏奇梦博客

Xiuno插件开发,Hook 机制说明 PHP 插件 XiunoBBS

Xiuno BBS 的插件机制分为两种,一种是 Hook,一种是 Overwrite。所谓 Hook,就是往代码里插入代码,多个插件的代码合并后插入到 hook...

4232
来自专栏SpringBoot 核心技术

SpringCloud组件:Eureka服务注册中心内置的REST节点列表

你有没有考虑过Eureka Client与Eureka Server是通过什么方式进行通讯的? 为什么Client启动成功后Server就会被注册到Serve...

8032
来自专栏Spring相关

Spring Boot 日志配置

默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了...

1706
来自专栏老码农专栏

ActFramework r1.3.0 - 激动人心的特性一览

1322
来自专栏Coding迪斯尼

java开发操作系统:同时运行多窗口多任务

1435
来自专栏xingoo, 一个梦想做发明家的程序员

Tomcat 6 --- JNDI详解

JNDI(Java Naming and Directory Interface, Java命名和目录接口),说白了,就是通过配置一些xml文件,方便用户直接...

2487
来自专栏一名合格java开发的自我修养

java接口调用——webservice就是一个RPC而已

  很多新手一听到接口就蒙逼,不知道接口是什么!其实接口就是RPC,通过远程访问别的程序提供的方法,然后获得该方法执行的接口,而不需要在本地执行该方法。就是本地...

2062
来自专栏乐沙弥的世界

Linux 内核参数优化(for oracle)

    Oracle 不同平台的数据库安装指导为我们部署Oracle提供了一些系统参数设置的建议值,然而建议值是在通用的情况下得出的结论,并非能完全满足不同的需...

1842

扫码关注云+社区

领取腾讯云代金券