Only the US-ASCII, UTF-8 and ISO-8859-1 charsets are supported. + * @param name the control name + * @param filename the filename (may be {@code null}) + * @param charset the charset used for the filename (may be {@code null}) + * @see rfc7230 Section 3.2.4 + * @since 5.0 + */ + public void setContentDispositionFormData(String name, String filename, Charset charset) { Assert.notNull(name, "'name' must not be null"); StringBuilder builder = new StringBuilder("form-data; name=\""); builder.append(name).append('\"'); if (filename != null) { - builder.append("; filename=\""); - builder.append(filename).append('\"'); + if(charset == null || StandardCharsets.US_ASCII.equals(charset)) { + builder.append("; filename=\""); + builder.append(filename).append('\"'); + } + else { + builder.append("; filename*="); + builder.append(StringUtils.encodeHttpHeaderFieldParam(filename, charset)); + } } set(CONTENT_DISPOSITION, builder.toString()); } diff --git a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java index 0e7a89ceac..a22f89c70c 100644 --- a/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java +++ b/spring-web/src/test/java/org/springframework/http/HttpHeadersTests.java @@ -321,6 +321,11 @@ public class HttpHeadersTests { headers.setContentDispositionFormData("name", "filename"); assertEquals("Invalid Content-Disposition header", "form-data; name=\"name\"; filename=\"filename\"", headers.getFirst("Content-Disposition")); + + headers.setContentDispositionFormData("name", "中文.txt", StandardCharsets.UTF_8); + assertEquals("Invalid Content-Disposition header", + "form-data; name=\"name\"; filename*=UTF-8''%E4%B8%AD%E6%96%87.txt", + headers.getFirst("Content-Disposition")); } @Test // SPR-11917