revised Servlet 3.0 based StandardServletMultipartResolver for correct param/file distinction; added multipart content type and headers access to MultipartRequest (dropping the previous header access solution on MultipartFile); MultipartFilter uses a Servlet 3.0 based StandardServletMultipartResolver by default
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2010 the original author or authors.
|
||||
* Copyright 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -126,13 +126,14 @@ public class CommonsPortletMultipartResolver extends CommonsFileUploadSupport
|
||||
MultipartParsingResult parsingResult = parseRequest(request);
|
||||
setMultipartFiles(parsingResult.getMultipartFiles());
|
||||
setMultipartParameters(parsingResult.getMultipartParameters());
|
||||
setMultipartParameterContentTypes(parsingResult.getMultipartParameterContentTypes());
|
||||
}
|
||||
};
|
||||
}
|
||||
else {
|
||||
MultipartParsingResult parsingResult = parseRequest(request);
|
||||
return new DefaultMultipartActionRequest(
|
||||
request, parsingResult.getMultipartFiles(), parsingResult.getMultipartParameters());
|
||||
return new DefaultMultipartActionRequest(request, parsingResult.getMultipartFiles(),
|
||||
parsingResult.getMultipartParameters(), parsingResult.getMultipartParameterContentTypes());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2008 the original author or authors.
|
||||
* Copyright 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -21,15 +21,15 @@ import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.List;
|
||||
import javax.portlet.ActionRequest;
|
||||
import javax.portlet.filter.ActionRequestWrapper;
|
||||
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
/**
|
||||
* Default implementation of the {@link MultipartActionRequest} interface.
|
||||
@@ -46,6 +46,8 @@ public class DefaultMultipartActionRequest extends ActionRequestWrapper implemen
|
||||
|
||||
private Map<String, String[]> multipartParameters;
|
||||
|
||||
private Map<String, String> multipartParameterContentTypes;
|
||||
|
||||
|
||||
/**
|
||||
* Wrap the given Portlet ActionRequest in a MultipartActionRequest.
|
||||
@@ -54,12 +56,13 @@ public class DefaultMultipartActionRequest extends ActionRequestWrapper implemen
|
||||
* @param mpParams a map of the parameters to expose,
|
||||
* with Strings as keys and String arrays as values
|
||||
*/
|
||||
public DefaultMultipartActionRequest(
|
||||
ActionRequest request, MultiValueMap<String, MultipartFile> mpFiles, Map<String, String[]> mpParams) {
|
||||
public DefaultMultipartActionRequest(ActionRequest request, MultiValueMap<String, MultipartFile> mpFiles,
|
||||
Map<String, String[]> mpParams, Map<String, String> mpParamContentTypes) {
|
||||
|
||||
super(request);
|
||||
setMultipartFiles(mpFiles);
|
||||
setMultipartParameters(mpParams);
|
||||
setMultipartParameterContentTypes(mpParamContentTypes);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -136,6 +139,16 @@ public class DefaultMultipartActionRequest extends ActionRequestWrapper implemen
|
||||
return paramMap;
|
||||
}
|
||||
|
||||
public String getMultipartContentType(String paramOrFileName) {
|
||||
MultipartFile file = getFile(paramOrFileName);
|
||||
if (file != null) {
|
||||
return file.getContentType();
|
||||
}
|
||||
else {
|
||||
return getMultipartParameterContentTypes().get(paramOrFileName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set a Map with parameter names as keys and list of MultipartFile objects as values.
|
||||
@@ -178,6 +191,27 @@ public class DefaultMultipartActionRequest extends ActionRequestWrapper implemen
|
||||
return this.multipartParameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a Map with parameter names as keys and content type Strings as values.
|
||||
* To be invoked by subclasses on initialization.
|
||||
*/
|
||||
protected final void setMultipartParameterContentTypes(Map<String, String> multipartParameterContentTypes) {
|
||||
this.multipartParameterContentTypes = multipartParameterContentTypes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtain the multipart parameter content type Map for retrieval,
|
||||
* lazily initializing it if necessary.
|
||||
* @see #initializeMultipart()
|
||||
*/
|
||||
protected Map<String, String> getMultipartParameterContentTypes() {
|
||||
if (this.multipartParameterContentTypes == null) {
|
||||
initializeMultipart();
|
||||
}
|
||||
return this.multipartParameterContentTypes;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Lazily initialize the multipart request, if possible.
|
||||
* Only called if not already eagerly initialized.
|
||||
|
||||
@@ -41,8 +41,6 @@ import org.springframework.web.multipart.MultipartFile;
|
||||
*/
|
||||
public class MockMultipartFile implements MultipartFile {
|
||||
|
||||
private static final String CONTENT_TYPE = "Content-Type";
|
||||
|
||||
private final String name;
|
||||
|
||||
private String originalFilename;
|
||||
@@ -133,26 +131,4 @@ public class MockMultipartFile implements MultipartFile {
|
||||
FileCopyUtils.copy(this.content, dest);
|
||||
}
|
||||
|
||||
public String getHeader(String name) {
|
||||
if (CONTENT_TYPE.equalsIgnoreCase(name)) {
|
||||
return this.contentType;
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public String[] getHeaders(String name) {
|
||||
if (CONTENT_TYPE.equalsIgnoreCase(name)) {
|
||||
return new String[] {this.contentType};
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public Iterator<String> getHeaderNames() {
|
||||
return Collections.singleton(CONTENT_TYPE).iterator();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2010 the original author or authors.
|
||||
* Copyright 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -82,4 +82,14 @@ public class MockMultipartActionRequest extends MockActionRequest implements Mul
|
||||
return new LinkedMultiValueMap<String, MultipartFile>(this.multipartFiles);
|
||||
}
|
||||
|
||||
public String getMultipartContentType(String paramOrFileName) {
|
||||
MultipartFile file = getFile(paramOrFileName);
|
||||
if (file != null) {
|
||||
return file.getContentType();
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2010 the original author or authors.
|
||||
* Copyright 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -18,6 +18,7 @@ package org.springframework.web.portlet;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
@@ -481,7 +482,7 @@ public class ComplexPortletApplicationContext extends StaticPortletApplicationCo
|
||||
files.set("someFile", new MockMultipartFile("someFile", "someContent".getBytes()));
|
||||
Map<String, String[]> params = new HashMap<String, String[]>();
|
||||
params.put("someParam", new String[] {"someParam"});
|
||||
return new DefaultMultipartActionRequest(request, files, params);
|
||||
return new DefaultMultipartActionRequest(request, files, params, Collections.<String, String>emptyMap());
|
||||
}
|
||||
|
||||
public void cleanupMultipart(MultipartActionRequest request) {
|
||||
|
||||
Reference in New Issue
Block a user