Spring Boot(1.2.5.RELEASE)Resttemplate Multipart File Upload UTF-8 Filename不可能

时间:2016-09-24 11:23:31

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

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

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

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

然后将文件名放入请求中: 内容处理:表格数据; NAME = “文件”;文件名= “=?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);

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

对于解决此问题的任何暗示,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

我也面临同样的问题,问题是Spring RestTemplateRFC 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();
    }
    

答案 1 :(得分:0)

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

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