【问题标题】:Spring Boot (1.2.5.RELEASE) Resttemplate Multipart File Upload UTF-8 Filename not possibleSpring Boot (1.2.5.RELEASE) Resttemplate Multipart File Upload UTF-8 Filename not possible
【发布时间】:2016-09-24 11:23:30
【问题描述】:

我有一个 Spring Boot Rest Service,它通过 RestTemplate 交换方法上传文件。上传工作正常,但 utf-8 文件名存在问题,例如包含 äöü 等德语变音符号。 从 HTML5 应用程序上传文件时,它可以正常工作,因此接收服务没有问题。

如果不为 MultipartCharset 设置任何编码,则变音符号将替换为“?” (例如 Überschrift.txt 得到 ?berschrift.txt),因为 US-ASCII 用于文件名编码。我尝试使用以下代码将 MultipartCharset 设置为 UTF-8:

((AllEncompassingFormHttpMessageConverter)restTemplate.getMessageConverters().get(4)).setMultipartCharset(Charset.forName("UTF-8"));

然后将文件名像这样放入请求中: 内容处置:表单数据;名称=“文件”;文件名="=?UTF-8?Q?=C3=9Cberschrift.txt?="

元音变音被编码,但文件名完全像这样传输,而不是正确的元音变音。我想我缺少一些要设置的属性,因此在请求中真的将元音变音设置为元音变音。

我的代码的相关部分是这样的:

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(uploadFile),"UTF-8"));    bw.append(capturedDocument.getText());
bw.newLine();
bw.flush();
bw.close();

String complianceServiceUrl = complianceBackendRestSettings.getComplianceServiceURL();
            RestTemplate restTemplate = new RestTemplate();
            ((AllEncompassingFormHttpMessageConverter)restTemplate.getMessageConverters().get(4)).setMultipartCharset(Charset.forName("UTF-8"));
ResponseEntity<JSONBoolean> responseEntity = null;
HttpHeaders uploadHeaders = new HttpHeaders();
uploadHeaders.set("Authorization", authorization);
uploadHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
LinkedMultiValueMap<String, Object> uploadMap = new LinkedMultiValueMap<String, Object>();
uploadMap.add("file", new FileSystemResource(uploadFile.getAbsolutePath()));
uploadMap.add("abonnementId", abos.toString());
                HttpEntity<LinkedMultiValueMap<String, Object>> uploadRequestEntity = new HttpEntity<LinkedMultiValueMap<String, Object>>(
                        uploadMap, uploadHeaders);
responseEntity = restTemplate.exchange(complianceServiceUrl + "/uploadandassign", HttpMethod.POST,
uploadRequestEntity, JSONBoolean.class);

文件中的变音符号完整正确,所以只是文件名编码的问题。

如果有任何解决此问题的提示,我将不胜感激。

【问题讨论】:

    标签: encoding utf-8 spring-boot multipartform-data resttemplate


    【解决方案1】:

    我也遇到了同样的问题,问题是 Spring 的 RestTemplate 遵循 RFC 2047,但 StandardMultipartHttpServletRequest 仅支持 RFC 6266 格式,或者标头需要已经是 UTF-8(某些浏览器的行为是什么)。

    我已经填写了bug request。我刚刚验证了 commons-fileupload 库可以正确处理这个问题。如果您使用的是 Spring Boot,则需要:

    1. 在类路径中添加 commons-fileupload 1.3.2

      <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.2</version>
      </dependency>
      
    2. 禁用 MultipartAutoConfiguration - 例如通过属性spring.http.multipart.enabled=false 或通过@EnableAutoConfiguration(exclude={MultipartAutoConfiguration.class})

    3. 在你的配置类中定义 MultipartResolver

      @Bean
      public MultipartResolver multipartResolver() {
          return new CommonsMultipartResolver();
      }
      

    【讨论】:

    • 非常感谢@myroch 提供清晰明了的解释和解决方案。
    【解决方案2】:

    我遇到了同样的问题,但是设置 multipartCharset 为我解决了这个问题。您的客户端代码看起来正确,并且文件名以 RFC 2047 格式正确编码。这种编码是必要的,因为 HTTP 仅在其标头中接受 ascii。 (What character encoding should I use for a HTTP header?)

    然后应该在服务器上将其解码回 Überschrift.txt。我不完全确定哪个 spring 组件可以做到这一点(假设你的服务器端也是用 Spring 编写的),但我认为它是多部分解析器

    【讨论】:

      猜你喜欢
      • 2015-10-05
      • 1970-01-01
      • 2015-11-07
      • 2016-06-03
      • 2020-01-13
      • 2020-02-19
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多