专栏首页Linyb极客之路如何破解springboot/springcloud上传中文文件名乱码魔咒

如何破解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)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java中实现不可变Map

    有时最好不允许修改 java.util.Map, 例如跨线程共享只读数据。为此,我们可以使用Unmodifiable Map或Immutable Map。

    lyb-geek
  • springboot实战之文件分片上传、断点续传、秒传

    上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法...

    lyb-geek
  • 如何使zuul支持websocket

    公司要把以前一个老的项目通过zuul来路由装发(ps:老项目作为微服务中的一个子服务),而这个老项目里面有用到websocket消息推送,然而不幸的是zuul1...

    lyb-geek
  • 记一次有意思的文件上传

    由于站点对上传文件未作过滤或过滤机制不严(文件后缀或类型),导致恶意用户可以上传脚本文件,通过上传文件可达到控制网站权限的目的。

    徐焱
  • Selenium结合Unirest和JTwig进行API测试

    前言:关于如何使用selenium webdriver测试REST api的问题,你可以在StackOverflow.com上看到很多相关的问题。不熟悉自动化...

    软测小生
  • 如何用一张图来做全年/去年的部门离职率动态对比

    我们在做部门的离职率的数据分析的时候,我们希望能对比每个部门每个月的离职率,同时也希望可以对比去年同期的离职数据,同时我们还希望去年的数据对比可以进行选择,...

    王佩军
  • RESTful API 设计指南

    网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备......)。 因此,必须有一种统一的机制,方便...

    ruanyf
  • docker compose启动报错

    ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables fa...

    似水的流年
  • RESTful API怎样设计更合理

    网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备……)。

    javascript.shop
  • java遍历List的三种方法

    DencyCheng

扫码关注云+社区

领取腾讯云代金券