2016-12-18 70 views
0

我在使用Spring RestTemplate上傳文件時出現問題。如果文件包含帶有重音的字符,則原始文件名編碼不正確,無法正確發送。帶有重音的字符將在服務器上顯示一個問號。帶有重音的Spring RestTemplate文件名

如果我使用郵遞員或高級休息客戶端,它的工作原理。使用wireshark進行嗅探時,我可以看到兩種工具對文件名進行不同的編碼。任何人都知道如何使RestTemplate正確處理文件名中的重音符號?

下面是我用來調用我的web服務端點的代碼。

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); 

回答

0

你需要一個UTF-8的消息轉換器添加到RestTemplate

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?

+0

我試過這個但沒有任何成功。這似乎沒有以任何方式影響文件名。 – Tammeuh

0

財產multipartCharset一套配置您RestTemplate定製FormHttpMessageConverter實例爲UTF-8 。

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

我看到一個效果,但結果還不如預期。現在服務器上的原始文件名字段包含:=?UTF-8?Q?S = C3 = A9curit = C3 = A9_report.pdf?=郵遞員可以發送文件名,並且它只是在另一側正常再現。 – Tammeuh

+0

如果我刪除過濾器,這就是我得到的。 S'curit? report.pdf – Tammeuh

+0

我的配置錯誤。在一個全新的項目中,這是有效的。我的確發現Spring也使用這種策略來編碼ISO-8859-1內容。我希望它能夠按原樣傳遞。一些RFC提到ASCII是多部分中文件名頭所需的編碼,其他人提到ISO-8859-1。無論如何,這種方式是有效的。剩下的唯一問題是這種解決方案的便攜性如何? – Tammeuh

相關問題