我有一个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"));然后将文件名放入请求中: Content-Disposition: form-data;name="file";filename="=?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);文件中的变音是正确的,所以这只是文件名编码的问题。
对于这个问题的解决方案,我将不胜感激。
发布于 2017-01-30 21:38:01
我也遇到了同样的问题,问题是Spring的RestTemplate遵循RFC 2047,但StandardMultipartHttpServletRequest只支持RFC 6266格式,或者头文件需要已经是UTF8格式的(有些浏览器的行为是什么)。
我已经填满了bug request。我刚刚验证了commons-fileupload库可以正确处理这个问题。如果您使用的是Spring Boot,则需要:
类路径上的
commons- @EnableAutoConfiguration(exclude={MultipartAutoConfiguration.class})
spring.http.multipart.enabled=false或fileupload MultipartResolver@Bean公共MultipartResolver multipartResolver() { return new CommonsMultipartResolver();}
发布于 2016-10-28 13:37:32
我也面临着同样的问题,但是设置multipartCharset为我解决了这个问题。您的客户端代码看起来是正确的,并且文件名以RFC2047格式正确编码。这种编码是必要的,因为HTTP只接受其报头中的ascii。(What character encoding should I use for a HTTP header?)
在服务器上,它应该被解码回Überschrift.txt。我不能完全确定哪个spring组件可以做到这一点(假设您的服务器端也是用Spring编写的),但我假设它是多部分解析器
https://stackoverflow.com/questions/39675773
复制相似问题