springcloud文件上传文件名乱码

springcloud文件上传文件名乱码


问题

multipart file取出来的文件名中文乱码。
排查问题:

  • 单独的server文件上传有无问题

  • gateway访问文件上传有无问题

  • gateway的/zuul访问是否有问题

配置

spring:
  http:
    encoding:
      charset: UTF-8
      force: true
      enabled: true
    multipart:
      max-file-size: 20Mb
      max-request-size: 20Mb
server:
  tomcat:
    uri-encoding: UTF-8

最后:然后通过gateway的/zuul/...访问即ok

在项目中又一个上传文件的oss服务,直接调用服务的上传文件成功,如果经过网关zuul服务,上传中文名字的文件,文件名会出现乱码,最终导致上传失败,如果上传英文名字的文件,没有任何问题。怀疑网关zuul对中文做编码处理。

那么,经过网关,调用上传文件的url地址如下:

localhost:5000/oss/file/upload

这时如果出现中文文件名,上传文件的文件名会出现失败。按照上述大神的办法,直接在这个uri,前面加上”/zuul”,那么请求地址如下:

localhost:5000/zuul/oss/file/upload

测试一下,果然通过,上传中文名的文件乱码问题解决。

上传文件的接口,代码如下:

@RestController
@RequestMapping("/file")
public class FileUploadController {
    @PostMapping("/upload")  
    public RespDTO handleFileUpload(@RequestParam("file") MultipartFile file) {
        //上传代码省略
        return RespDTO.onSuc(upLoadResult);
    }

======================================================

第一步,约定传参编码格式

不管是使用httpclient,还是okhttp,都要设置传参的编码,为了统一,这里全部设置为utf-8

第二步,修改application.properties文件

增加如下配置:

spring.http.encoding.force=true
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8
  • 1
  • 2
  • 3
  • 4

此时拦截器中返回的中文已经不乱码了,但是controller中返回的数据依旧乱码。

第三步,修改controller的@RequestMapping

修改如下:

produces="text/plain;charset=UTF-8"
  • 1

这种方法的弊端是限定了数据类型,继续查找资料,在stackoverflow上发现解决办法,是在配置类中增加如下代码:

@Configuration
public class CustomMVCConfiguration extends WebMvcConfigurerAdapter {

    @Bean
    public HttpMessageConverter responseBodyConverter() {
        StringHttpMessageConverter converter = new StringHttpMessageConverter(
                Charset.forName("UTF-8"));
        return converter;
    }

    @Override
    public void configureMessageConverters(
            List> converters) {
        super.configureMessageConverters(converters);
        converters.add(responseBodyConverter());
    }

    @Override
    public void configureContentNegotiation(
            ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(false);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

便可以解决SpringBoot的中文乱码问题了。 


你可能感兴趣的:(java)