Skip to content

Commit d0893c4

Browse files
committed
SPR-6247 - Multipart Content-Type charset is ignored in CommonsFileUploadSupport.
1 parent d54a975 commit d0893c4

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

org.springframework.web/src/main/java/org/springframework/web/multipart/commons/CommonsFileUploadSupport.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.HashMap;
2323
import java.util.List;
2424
import java.util.Map;
25+
import java.nio.charset.Charset;
2526

2627
import org.apache.commons.fileupload.FileItem;
2728
import org.apache.commons.fileupload.FileItemFactory;
@@ -36,6 +37,7 @@
3637
import org.springframework.util.StringUtils;
3738
import org.springframework.web.multipart.MultipartFile;
3839
import org.springframework.web.util.WebUtils;
40+
import org.springframework.http.MediaType;
3941

4042
/**
4143
* Base class for multipart resolvers that use Jakarta Commons FileUpload
@@ -221,14 +223,15 @@ protected MultipartParsingResult parseFileItems(List<FileItem> fileItems, String
221223
for (FileItem fileItem : fileItems) {
222224
if (fileItem.isFormField()) {
223225
String value;
224-
if (encoding != null) {
226+
String partEncoding = determineEncoding(fileItem.getContentType(), encoding);
227+
if (partEncoding != null) {
225228
try {
226-
value = fileItem.getString(encoding);
229+
value = fileItem.getString(partEncoding);
227230
}
228231
catch (UnsupportedEncodingException ex) {
229232
if (logger.isWarnEnabled()) {
230233
logger.warn("Could not decode multipart item '" + fileItem.getFieldName() +
231-
"' with encoding '" + encoding + "': using platform default");
234+
"' with encoding '" + partEncoding + "': using platform default");
232235
}
233236
value = fileItem.getString();
234237
}
@@ -281,6 +284,15 @@ protected void cleanupFileItems(Collection<MultipartFile> multipartFiles) {
281284
}
282285
}
283286

287+
private String determineEncoding(String contentTypeHeader, String defaultEncoding) {
288+
if (!StringUtils.hasText(contentTypeHeader)) {
289+
return defaultEncoding;
290+
}
291+
MediaType contentType = MediaType.parseMediaType(contentTypeHeader);
292+
Charset charset = contentType.getCharSet();
293+
return charset != null ? charset.name() : defaultEncoding;
294+
}
295+
284296

285297
/**
286298
* Holder for a Map of Spring MultipartFiles and a Map of

org.springframework.web/src/test/java/org/springframework/http/MediaTypeTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.ArrayList;
2020
import java.util.Collections;
2121
import java.util.List;
22+
import java.nio.charset.Charset;
2223

2324
import static org.junit.Assert.*;
2425
import org.junit.Test;
@@ -55,6 +56,15 @@ public void parseMediaType() throws Exception {
5556
assertEquals("Invalid quality factor", 0.2D, mediaType.getQualityValue(), 0D);
5657
}
5758

59+
@Test
60+
public void parseCharset() throws Exception {
61+
String s = "text/html; charset=iso-8859-1";
62+
MediaType mediaType = MediaType.parseMediaType(s);
63+
assertEquals("Invalid type", "text", mediaType.getType());
64+
assertEquals("Invalid subtype", "html", mediaType.getSubtype());
65+
assertEquals("Invalid charset", Charset.forName("ISO-8859-1"), mediaType.getCharSet());
66+
}
67+
5868
@Test
5969
public void parseURLConnectionMediaType() throws Exception {
6070
String s = "*; q=.2";

org.springframework.web/src/test/java/org/springframework/web/multipart/commons/CommonsMultipartResolverTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ public List parseRequest(HttpServletRequest request) {
375375
MockFileItem fileItem2x = new MockFileItem(
376376
"field2x", "type2", empty ? "" : "C:\\field2x.txt", empty ? "" : "text2");
377377
MockFileItem fileItem3 = new MockFileItem("field3", null, null, "value3");
378-
MockFileItem fileItem4 = new MockFileItem("field4", null, null, "value4");
378+
MockFileItem fileItem4 = new MockFileItem("field4", "text/html; charset=iso-8859-1", null, "value4");
379379
MockFileItem fileItem5 = new MockFileItem("field4", null, null, "value5");
380380
fileItems.add(fileItem1);
381381
fileItems.add(fileItem1x);

0 commit comments

Comments
 (0)