【问题标题】:Spring RestTemplate filename with accents带有重音符号的 Spring RestTemplate 文件名
【发布时间】:2016-12-18 20:47:44
【问题描述】:

我在使用 Spring RestTemplate 上传文件时遇到问题。如果文件包含带重音的字符,则原始文件名未正确编码并且未正确通过网络发送。带重音的字符在服务器上显示为带问号。

如果我使用 Postman 或 Advanced Rest Client,它可以工作。使用wireshark 进行嗅探时,我可以看到两种工具对文件名的编码方式不同。有人知道如何让 RestTemplate 正确处理文件名中的重音符号吗?

下面是我用来调用我的网络服务端点的代码。

final String fileName = "Sécurité report.pdf";
final LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("file", new ClassPathResource(fileName));
final HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);

final HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<>(map, headers);

final RestTemplate restTemplate = new RestTemplate();
final ResponseEntity<String> result = restTemplate.exchange("http://localhost:8080", HttpMethod.POST, requestEntity, String.class);

【问题讨论】:

    标签: java spring spring-mvc resttemplate


    【解决方案1】:

    您需要在RestTemplate添加一个UTF-8消息转换器

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters()
        .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
    

    另请参阅:How can I tell RestTemplate to POST with UTF-8 encoding?

    【讨论】:

    • 我试过这个但没有成功。这似乎不会以任何方式影响文件名。
    【解决方案2】:

    使用自定义 FormHttpMessageConverter 实例配置您的 RestTemplate,并将属性 multipartCharset 设置为 UTF-8。

    FormHttpMessageConverter converter = new FormHttpMessageConverter();
    converter.setMultipartCharset(Charset.forName("UTF-8"));
    

    【讨论】:

    • 我看到了效果,但结果还不如预期。服务器上的原始文件名字段现在包含: =?UTF-8?Q?S=C3=A9curit=C3=A9_report.pdf?= 邮递员可以发送文件名,它只是在另一端正常重新出现。
    • 如果我删除过滤器,这就是我得到的。 S?curit?报告.pdf
    • 我的配置错误。在一个全新的项目中,这很有效。我确实觉得很奇怪 Spring 也使用这种策略来编码 ISO-8859-1 内容。我希望它按原样通过。一些 RFC 提到 ASCII 作为多部分中文件名标头的必需编码,另一些提到 ISO-8859-1。无论如何,这种方式是有效的。剩下的唯一问题是这个解决方案的便携性如何?
    • 我认为 100% 确定的唯一方法是针对您的目标服务器测试文件上传。 RFC2047 中描述了 FormHttpMessageConverter 用于编码非 ASCII 文件名的 AFAIK encoded-word 方法,根据 RFC2388 推荐并得到每个主要网络服务器的支持。
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    相关资源
    最近更新 更多