From 9be0cf21e5d3537d2415fea5eaea152e7407d45b Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 25 Sep 2014 18:00:55 -0400 Subject: [PATCH] Support writing multipart non-ASCII file names Issue: SPR-12108 --- build.gradle | 1 + .../converter/FormHttpMessageConverter.java | 28 ++++++++++++++++++- .../FormHttpMessageConverterTests.java | 21 +++++++++++++- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 90668b6ecbf..23160e47658 100644 --- a/build.gradle +++ b/build.gradle @@ -684,6 +684,7 @@ project("spring-web") { optional("log4j:log4j:1.2.17") optional("com.googlecode.protobuf-java-format:protobuf-java-format:1.2") optional("com.google.protobuf:protobuf-java:${protobufVersion}") + optional("javax.mail:javax.mail-api:1.5.2") testCompile(project(":spring-context-support")) // for JafMediaTypeFactory testCompile("xmlunit:xmlunit:1.5") testCompile("org.slf4j:slf4j-jcl:${slf4jVersion}") diff --git a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java index 02ba3b6fce1..b7133861b2b 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java @@ -41,6 +41,8 @@ import org.springframework.util.MultiValueMap; import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; +import javax.mail.internet.MimeUtility; + /** * Implementation of {@link HttpMessageConverter} to read and write 'normal' HTML * forms and also to write (but not read) multipart data (e.g. file uploads). @@ -92,6 +94,8 @@ public class FormHttpMessageConverter implements HttpMessageConverter supportedMediaTypes = new ArrayList(); private List> partConverters = new ArrayList>(); @@ -118,6 +122,18 @@ public class FormHttpMessageConverter implements HttpMessageConverterIf not set file names will be encoded as US-ASCII. + * @param multipartCharset the charset to use + * @see Encoded-Word + */ + public void setMultipartCharset(Charset multipartCharset) { + this.multipartCharset = multipartCharset; + } + /** * Set the list of {@link MediaType} objects supported by this converter. */ @@ -374,7 +390,17 @@ public class FormHttpMessageConverter implements HttpMessageConverter")); HttpHeaders entityHeaders = new HttpHeaders(); entityHeaders.setContentType(MediaType.TEXT_XML); @@ -123,6 +134,7 @@ public class FormHttpMessageConverterTests { parts.add("xml", entity); MockHttpOutputMessage outputMessage = new MockHttpOutputMessage(); + converter.setMultipartCharset(Charset.forName("UTF-8")); converter.write(parts, MediaType.MULTIPART_FORM_DATA, outputMessage); final MediaType contentType = outputMessage.getHeaders().getContentType(); @@ -132,7 +144,7 @@ public class FormHttpMessageConverterTests { FileItemFactory fileItemFactory = new DiskFileItemFactory(); FileUpload fileUpload = new FileUpload(fileItemFactory); List items = fileUpload.parseRequest(new MockHttpOutputMessageRequestContext(outputMessage)); - assertEquals(5, items.size()); + assertEquals(6, items.size()); FileItem item = items.get(0); assertTrue(item.isFormField()); assertEquals("name 1", item.getFieldName()); @@ -156,6 +168,13 @@ public class FormHttpMessageConverterTests { assertEquals(logo.getFile().length(), item.getSize()); item = items.get(4); + assertFalse(item.isFormField()); + assertEquals("utf8", item.getFieldName()); + assertEquals("Hall\u00F6le.jpg", item.getName()); + assertEquals("image/jpeg", item.getContentType()); + assertEquals(logo.getFile().length(), item.getSize()); + + item = items.get(5); assertEquals("xml", item.getFieldName()); assertEquals("text/xml", item.getContentType()); verify(outputMessage.getBody(), never()).close();