我有一个 Spring Boot Rest Service,它通过 RestTemplate 交换方法上传文件。上传工作正常,但 utf-8 文件名存在问题,例如包含德语变音符号,如 äöü。从HTML5应用程序上传文件时,它可以正常工作,因此在接收服务中不是问题。
在不为多部分字符集设置任何编码的情况下,变音符号将替换为“?”(例如 Überschrift.txt 得到 ?berschrift.txt),因为 US-ASCII 用于文件名编码。我尝试使用以下代码将多部分字符集设置为 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);
文件中的变音是正确的,所以这只是文件名编码的问题。
我将感谢任何解决这个问题的建议。
我也遇到了同样的问题,问题是Spring的RestTemplate
遵循RFC 2047,但是Standard ardMultipartHttpServletRequest
只支持RFC 6266格式,或者标头已经需要使用UTF-8(一些浏览器的行为是什么)。
我已经填写了bug请求。我刚刚验证了Comms-fileupload库将正确处理此问题。如果您使用的是Spring Boot,您将需要:
>
在类路径上添加共享资源文件上传 1.3.2
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
禁用MultipartAutoConfiguration-例如通过属性spring. http.multipart.启用=false
或通过@EnableAutoConfiguration(排除={MultipartAutoConfiguration.class})
在配置类中定义多部分解析程序
@Bean
public MultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}
我也遇到了同样的问题,但是设置multipartCharset为我解决了这个问题。您的客户端代码看起来是正确的,并且文件名以RFC 2047格式正确编码。这种编码是必要的,因为HTTP在其标头中只接受ascii。(我应该对HTTP标头使用什么字符编码?)
在服务器上,它应该被解码回Überschrift. txt。我不完全确定哪个Spring组件执行此操作(假设您的服务器端也是用Spring编写的),但我假设它是多部分解析器