【发布时间】: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