2016-12-18 4 views
0

Spring RestTemplateでファイルをアップロードする際に問題があります。ファイルにアクセント付きの文字が含まれている場合、元のファイル名は正しくエンコードされず、ワイヤを介して正しく送信されません。アクセント付きの文字は、サーバー上に疑問符で表示されます。アクセント付きのSpring RestTemplateファイル名

私はPostmanまたはAdvanced Rest Clientを使用すると動作します。 wiresharkを使用してスニッフィングすると、両方のツールがファイル名を別々にエンコードすることがわかります。誰でもRestTemplateがファイル名でアクセントを正しく扱えるようにする方法を考えましたか?

以下は、私のwebserviceエンドポイントを呼び出すために使用しているコードです。

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

はまたRestTemplate

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

参照するにはUTF-8メッセージコンバータを追加する必要があります。How can I tell RestTemplate to POST with UTF-8 encoding?

+0

私はこれを試しましたが、成功しませんでした。これはどんな形でもファイル名には影響しないようです。 – Tammeuh

0

がUTF-8にプロパティmultipartCharsetセットでごRestTemplateカスタムとFormHttpMessageConverterインスタンスを設定します。

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

効果がありますが、その結果はまだ期待どおりではありません。 =サーバーの元のファイル名フィールドには、次の情報が含まれます。=?UTF-8?Q?S = C3 = A9curit = C3 = A9_report.pdf?= Postmanはファイル名を送信できます。 – Tammeuh

+0

フィルタを削除した場合、これが表示されます。 S?curit? report.pdf – Tammeuh

+0

私の最後に誤った設定があります。すべての新しいプロジェクトで、これはうまくいきます。私は、Springがこの戦略を使ってISO-8859-1のコンテンツもエンコードするのは奇妙です。私はそれがそのまま渡されると思います。 RFCの中には、マルチパート内のファイル名ヘッダーに必要なエンコーディングとしてASCIIが挙げられているものもあれば、ISO-8859-1に言及しているものもあります。いずれにしても、このように動作します。残っている唯一の質問は、このソリューションがどのように移植可能なのかです。 – Tammeuh

関連する問題