首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring Boot (1.2.5.RELEASE) Resttemplate Multipart File Upload UTF-8 Filename不可用

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

Stack Overflow用户
提问于 2016-09-24 19:23:31
回答 2查看 2.8K关注 0票数 2

我有一个Spring Boot Rest Service,它通过RestTemplate交换方法上传文件。上传工作正常,但是utf-8文件名有一个问题,例如包含像äöü这样的德语元音。当从HTML5应用程序上传文件时,它的工作没有任何问题,所以它在接收服务时不是问题。

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

代码语言:javascript
运行
复制
((AllEncompassingFormHttpMessageConverter)restTemplate.getMessageConverters().get(4)).setMultipartCharset(Charset.forName("UTF-8"));

然后将文件名放入请求中: Content-Disposition: form-data;name="file";filename="=?UTF-8?Q?=C3=9Cberschrift.txt?=“

变音是经过编码的,但文件名的传输方式与此完全相同,并且不是使用正确的变音。我想我遗漏了一些要设置的属性,所以在请求中真正将元音设置为元音。

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

代码语言:javascript
运行
复制
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);

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

对于这个问题的解决方案,我将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2017-01-30 21:38:01

我也遇到了同样的问题,问题是Spring的RestTemplate遵循RFC 2047,但StandardMultipartHttpServletRequest只支持RFC 6266格式,或者头文件需要已经是UTF8格式的(有些浏览器的行为是什么)。

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

类路径上的

  1. 添加commons-fileupload 1.3.2

commons- @EnableAutoConfiguration(exclude={MultipartAutoConfiguration.class})

  • Define上传commons-fileupload commons-fileupload 1.3.2

  • 禁用MultipartAutoConfiguration -例如通过配置类中的属性spring.http.multipart.enabled=false或fileupload MultipartResolver

@Bean公共MultipartResolver multipartResolver() { return new CommonsMultipartResolver();}

票数 2
EN

Stack Overflow用户

发布于 2016-10-28 13:37:32

我也面临着同样的问题,但是设置multipartCharset为我解决了这个问题。您的客户端代码看起来是正确的,并且文件名以RFC2047格式正确编码。这种编码是必要的,因为HTTP只接受其报头中的ascii。(What character encoding should I use for a HTTP header?)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39675773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档