Encoding Spring引导(1.2.5.RELEASE)Resttemplate多部分文件上载UTF-8文件名不可能

Encoding Spring引导(1.2.5.RELEASE)Resttemplate多部分文件上载UTF-8文件名不可能,encoding,utf-8,spring-boot,multipartform-data,resttemplate,Encoding,Utf 8,Spring Boot,Multipartform Data,Resttemplate,我有一个SpringBootREST服务,它通过RestTemplate交换方法上传一个文件。上传工作正常,但utf-8文件名存在问题,例如包含像äöü这样的德语umlauts。 当从HTML5应用程序上传文件时,它可以正常工作,因此在接收服务中不是问题 在没有为MultipartCharset设置任何编码的情况下,umlauts被替换为“”(例如,Überschrift.txt获取?berschrift.txt),因为US-ASCII用于文件名编码。我尝试使用以下代码将MultipartCha

我有一个SpringBootREST服务,它通过RestTemplate交换方法上传一个文件。上传工作正常,但utf-8文件名存在问题,例如包含像äöü这样的德语umlauts。 当从HTML5应用程序上传文件时,它可以正常工作,因此在接收服务中不是问题

在没有为MultipartCharset设置任何编码的情况下,umlauts被替换为“”(例如,Überschrift.txt获取?berschrift.txt),因为US-ASCII用于文件名编码。我尝试使用以下代码将MultipartCharset设置为UTF-8:

((AllEncompassingFormHttpMessageConverter)restTemplate.getMessageConverters().get(4)).setMultipartCharset(Charset.forName("UTF-8"));
然后将文件名按如下方式放入请求中: 内容配置:表单数据;name=“file”;filename=“=?UTF-8?Q?=C3=9Cberschrift.txt?=”

UMLAUT已编码,但文件名的传输方式与此完全相同,并且不使用正确的UMLAUT。我认为我缺少一些要设置的属性,因此在请求中umlauts实际上被设置为umlauts

我的代码的相关部分如下:

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);
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(uploadFile),“UTF-8”);append(capturedDocument.getText());
换行符();
bw.flush();
bw.close();
字符串complianceServiceUrl=complianceBackendRestSettings.getComplianceServiceURL();
RestTemplate RestTemplate=新RestTemplate();
((allencompacsingformhttpmessageconverter)restemplate.getMessageConverters().get(4)).setMultipartCharset(Charset.forName(“UTF-8”);
ResponseEntity ResponseEntity=null;
HttpHeaders uploadHeaders=新的HttpHeaders();
uploadHeaders.set(“授权”,Authorization);
uploadHeaders.setContentType(MediaType.MULTIPART\u FORM\u数据);
LinkedMultiValueMap uploadMap=新建LinkedMultiValueMap();
uploadMap.add(“文件”,新文件系统资源(uploadFile.getAbsolutePath());
add(“abonnementId”,abos.toString());
HttpEntity uploadRequestEntity=新HttpEntity(
uploadMap,uploadHeaders);
responseEntity=restemplate.exchange(complianceServiceUrl+“/uploadandassign”,HttpMethod.POST,
uploadRequestEntity,JSONBoolean.class);
文件中的umlauts是正确完成的,所以这只是文件名编码的问题


如果能给我一些提示来解决这个问题,我将不胜感激。

我也面临同样的问题,但设置multipartCharset为我解决了这个问题。您的客户端代码看起来正确,文件名以RFC 2047格式正确编码。这种编码是必要的,因为HTTP只接受其标头中的ascii。()


在服务器上,它应该被解码回Überschrift.txt。我不完全确定哪个spring组件会这样做(假设您的服务器端也是用spring编写的),但我假设它是多部分解析器,我也遇到了同样的问题,问题是spring的RestTemplate随后出现,但
StandardMultipartHttpServletRequest
只支持格式,或者标头必须已经在UTF-8中(某些浏览器的行为是什么)

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

  • 在类路径上添加commons fileupload 1.3.2

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.2</version>
    </dependency>
    

  • 感谢一吨@myroch提供清晰明了的解释和解决方案。
    @Bean
    public MultipartResolver multipartResolver() {
        return new CommonsMultipartResolver();
    }