SPR-2784: Support MultipartFile-array property
This commit is contained in:
@@ -32,6 +32,7 @@ import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.LinkedCaseInsensitiveMap;
|
||||
@@ -494,6 +495,19 @@ public class HttpHeaders implements MultiValueMap<String, String> {
|
||||
headers.put(headerName, headerValues);
|
||||
}
|
||||
|
||||
public void setAll(Map<String, String> values) {
|
||||
for (Entry<String, String> entry : values.entrySet()) {
|
||||
set(entry.getKey(), entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
public Map<String, String> toSingleValueMap() {
|
||||
LinkedHashMap<String, String> singleValueMap = new LinkedHashMap<String,String>(this.headers.size());
|
||||
for (Entry<String, List<String>> entry : headers.entrySet()) {
|
||||
singleValueMap.put(entry.getKey(), entry.getValue().get(0));
|
||||
}
|
||||
return singleValueMap;
|
||||
}
|
||||
|
||||
// Map implementation
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@ package org.springframework.web.multipart;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.util.MultiValueMap;
|
||||
|
||||
/**
|
||||
* This interface defines the multipart request access operations
|
||||
@@ -26,6 +29,7 @@ import java.util.Map;
|
||||
* {@link org.springframework.web.portlet.multipart.MultipartActionRequest}.
|
||||
*
|
||||
* @author Juergen Hoeller
|
||||
* @author Arjen Poutsma
|
||||
* @since 2.5.2
|
||||
*/
|
||||
public interface MultipartRequest {
|
||||
@@ -43,16 +47,33 @@ public interface MultipartRequest {
|
||||
* Return the contents plus description of an uploaded file in this request,
|
||||
* or <code>null</code> if it does not exist.
|
||||
* @param name a String specifying the parameter name of the multipart file
|
||||
* @return the uploaded content in the form of a {@link org.springframework.web.multipart.MultipartFile} object
|
||||
* @return the uploaded content in the form of a {@link MultipartFile} object
|
||||
*/
|
||||
MultipartFile getFile(String name);
|
||||
|
||||
/**
|
||||
* Return the contents plus description of uploaded files in this request,
|
||||
* or an empty list if it does not exist.
|
||||
* @param name a String specifying the parameter name of the multipart file
|
||||
* @return the uploaded content in the form of a {@link MultipartFile} list
|
||||
*/
|
||||
List<MultipartFile> getFiles(String name);
|
||||
|
||||
/**
|
||||
* Return a {@link java.util.Map} of the multipart files contained in this request.
|
||||
* @return a map containing the parameter names as keys, and the
|
||||
* {@link org.springframework.web.multipart.MultipartFile} objects as values
|
||||
* {@link MultipartFile} objects as values
|
||||
* @see MultipartFile
|
||||
*/
|
||||
Map<String, MultipartFile> getFileMap();
|
||||
|
||||
/**
|
||||
* Return a {@link MultiValueMap} of the multipart files contained in this request.
|
||||
* @return a map containing the parameter names as keys, and a list of
|
||||
* {@link MultipartFile} objects as values
|
||||
* @see MultipartFile
|
||||
*/
|
||||
MultiValueMap<String, MultipartFile> getMultiFileMap();
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -31,8 +31,9 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.web.multipart.MultipartException;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.util.WebUtils;
|
||||
|
||||
@@ -213,7 +214,7 @@ public abstract class CommonsFileUploadSupport {
|
||||
* @see CommonsMultipartFile#CommonsMultipartFile(org.apache.commons.fileupload.FileItem)
|
||||
*/
|
||||
protected MultipartParsingResult parseFileItems(List<FileItem> fileItems, String encoding) {
|
||||
Map<String, MultipartFile> multipartFiles = new HashMap<String, MultipartFile>();
|
||||
MultiValueMap<String, MultipartFile> multipartFiles = new LinkedMultiValueMap<String, MultipartFile>();
|
||||
Map<String, String[]> multipartParameters = new HashMap<String, String[]>();
|
||||
|
||||
// Extract multipart files and multipart parameters.
|
||||
@@ -249,10 +250,7 @@ public abstract class CommonsFileUploadSupport {
|
||||
else {
|
||||
// multipart file field
|
||||
CommonsMultipartFile file = new CommonsMultipartFile(fileItem);
|
||||
if (multipartFiles.put(file.getName(), file) != null) {
|
||||
throw new MultipartException("Multiple files for field name [" + file.getName() +
|
||||
"] found - not supported by MultipartResolver");
|
||||
}
|
||||
multipartFiles.add(file.getName(), file);
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Found multipart file [" + file.getName() + "] of size " + file.getSize() +
|
||||
" bytes with original filename [" + file.getOriginalFilename() + "], stored " +
|
||||
@@ -290,7 +288,7 @@ public abstract class CommonsFileUploadSupport {
|
||||
*/
|
||||
protected static class MultipartParsingResult {
|
||||
|
||||
private final Map<String, MultipartFile> multipartFiles;
|
||||
private final MultiValueMap<String, MultipartFile> multipartFiles;
|
||||
|
||||
private final Map<String, String[]> multipartParameters;
|
||||
|
||||
@@ -299,7 +297,7 @@ public abstract class CommonsFileUploadSupport {
|
||||
* @param mpFiles Map of field name to MultipartFile instance
|
||||
* @param mpParams Map of field name to form field String value
|
||||
*/
|
||||
public MultipartParsingResult(Map<String, MultipartFile> mpFiles, Map<String, String[]> mpParams) {
|
||||
public MultipartParsingResult(MultiValueMap<String, MultipartFile> mpFiles, Map<String, String[]> mpParams) {
|
||||
this.multipartFiles = mpFiles;
|
||||
this.multipartParameters = mpParams;
|
||||
}
|
||||
@@ -307,7 +305,7 @@ public abstract class CommonsFileUploadSupport {
|
||||
/**
|
||||
* Return the multipart files as Map of field name to MultipartFile instance.
|
||||
*/
|
||||
public Map<String, MultipartFile> getMultipartFiles() {
|
||||
public MultiValueMap<String, MultipartFile> getMultipartFiles() {
|
||||
return this.multipartFiles;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,24 +19,28 @@ package org.springframework.web.multipart.support;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletRequestWrapper;
|
||||
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
|
||||
/**
|
||||
* Abstract base implementation of the MultipartHttpServletRequest interface.
|
||||
* Provides management of pre-generated MultipartFile instances.
|
||||
*
|
||||
* @author Juergen Hoeller
|
||||
* @author Arjen Poutsma
|
||||
* @since 06.10.2003
|
||||
*/
|
||||
public abstract class AbstractMultipartHttpServletRequest extends HttpServletRequestWrapper
|
||||
implements MultipartHttpServletRequest {
|
||||
|
||||
private Map<String, MultipartFile> multipartFiles;
|
||||
private MultiValueMap<String, MultipartFile> multipartFiles;
|
||||
|
||||
|
||||
/**
|
||||
@@ -53,20 +57,34 @@ public abstract class AbstractMultipartHttpServletRequest extends HttpServletReq
|
||||
}
|
||||
|
||||
public MultipartFile getFile(String name) {
|
||||
return getMultipartFiles().get(name);
|
||||
return getMultipartFiles().getFirst(name);
|
||||
}
|
||||
|
||||
public List<MultipartFile> getFiles(String name) {
|
||||
List<MultipartFile> multipartFiles = getMultipartFiles().get(name);
|
||||
if (multipartFiles != null) {
|
||||
return multipartFiles;
|
||||
}
|
||||
else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
public Map<String, MultipartFile> getFileMap() {
|
||||
return getMultipartFiles().toSingleValueMap();
|
||||
}
|
||||
|
||||
public MultiValueMap<String, MultipartFile> getMultiFileMap() {
|
||||
return getMultipartFiles();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set a Map with parameter names as keys and MultipartFile objects as values.
|
||||
* Set a Map with parameter names as keys and list of MultipartFile objects as values.
|
||||
* To be invoked by subclasses on initialization.
|
||||
*/
|
||||
protected final void setMultipartFiles(Map<String, MultipartFile> multipartFiles) {
|
||||
this.multipartFiles = Collections.unmodifiableMap(multipartFiles);
|
||||
protected final void setMultipartFiles(MultiValueMap<String, MultipartFile> multipartFiles) {
|
||||
this.multipartFiles =
|
||||
new LinkedMultiValueMap<String, MultipartFile>(Collections.unmodifiableMap(multipartFiles));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -74,7 +92,7 @@ public abstract class AbstractMultipartHttpServletRequest extends HttpServletReq
|
||||
* lazily initializing it if necessary.
|
||||
* @see #initializeMultipart()
|
||||
*/
|
||||
protected Map<String, MultipartFile> getMultipartFiles() {
|
||||
protected MultiValueMap<String, MultipartFile> getMultipartFiles() {
|
||||
if (this.multipartFiles == null) {
|
||||
initializeMultipart();
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import java.util.Set;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
|
||||
/**
|
||||
* Default implementation of the
|
||||
@@ -33,6 +34,7 @@ import org.springframework.web.multipart.MultipartFile;
|
||||
*
|
||||
* @author Trevor D. Cook
|
||||
* @author Juergen Hoeller
|
||||
* @author Arjen Poutsma
|
||||
* @since 29.09.2003
|
||||
* @see org.springframework.web.multipart.MultipartResolver
|
||||
*/
|
||||
@@ -49,7 +51,7 @@ public class DefaultMultipartHttpServletRequest extends AbstractMultipartHttpSer
|
||||
* with Strings as keys and String arrays as values
|
||||
*/
|
||||
public DefaultMultipartHttpServletRequest(
|
||||
HttpServletRequest request, Map<String, MultipartFile> mpFiles, Map<String, String[]> mpParams) {
|
||||
HttpServletRequest request, MultiValueMap<String, MultipartFile> mpFiles, Map<String, String[]> mpParams) {
|
||||
|
||||
super(request);
|
||||
setMultipartFiles(mpFiles);
|
||||
|
||||
Reference in New Issue
Block a user