2016-12-18 1 views
0

봄 RestTemplate 함께 파일을 업로드하는 데 문제가 있습니다. 파일에 악센트가있는 문자가 포함되어 있으면 원본 파일 이름이 올바르게 인코딩되지 않고 올바르게 전송되지 않습니다. 악센트가있는 문자는 서버에 물음표와 함께 표시됩니다.봄 RestTemplate 파일 이름 악센트 함께

우편 배달부 또는 고급 휴식 클라이언트를 사용하는 경우 작동합니다. 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); 

답변

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? = 우편 배달부는 파일 이름을 보낼 수 있으며 상대방에서 정상적으로 다시 나타납니다. – Tammeuh

+0

필터를 제거하면 이것이 나옵니다. S? curit? report.pdf – Tammeuh

+0

제 마지막에 잘못된 설정이 있습니다. 모든 새로운 프로젝트에서이 작업이 가능합니다. Spring이 ISO-8859-1 컨텐트를 인코딩하기 위해이 전략을 사용한다는 것이 이상하다는 것을 알았습니다. 나는 그것이 그대로 전달 될 것으로 기대합니다. 일부 RFC는 ASCII를 멀티 파트의 파일 이름 헤더에 필요한 인코딩으로 언급하고 다른 일부는 ISO-8859-1을 언급합니다. 어쨌든이 방법으로 작동합니다. 남아있는 유일한 질문은이 솔루션이 어떻게 이식 가능합니까? – Tammeuh

관련 문제