让Spring正确响应HTTP PUT方法的文件上载请求是相当轻松的。
它所要做的就是重写自定义的MultipartResolver类中的isMultipart()方法。
import org.apache.commons.fileupload.FileUploadbase;import org.apache.commons.fileupload.servlet.ServletRequestContext;import javax.servlet.http.HttpServletRequest;public class PostAndPutCommonsMultipartResolver extends CommonsMultipartResolver { private static final String POST_METHOD = "POST"; private static final String PUT_METHOD = "PUT"; @Override public boolean isMultipart(HttpServletRequest request) { boolean isMultipartRequest = false; if (request != null) { if (POST_METHOD.equalsIgnoreCase(request.getMethod()) || PUT_METHOD.equalsIgnoreCase(request.getMethod())) { isMultipartRequest = FileUploadbase.isMultipartContent(new ServletRequestContext(request)); } } return isMultipartRequest; }}真正重要的是扩展了默认的MultipartResolver,以便isMultipart()方法将为POST或PUT请求返回true。
通常,有两个默认的MultipartResolver实现:
CommonsMultipartResolver(与Apache
Commons
FileUpload一起使用)和StandardServletMultipartResolver(与Servlet
3.0+ Part API一起使用)。
由于我们使用的是Apache Commons
FileUpload,因此我们扩展了CommonsMultipartResolver类。
MultipartResolver的Javadoc页面上有文档,解释了如何为您的应用程序正确定义自定义的MultipartResolver(添加了重点):
Spring DispatcherServlets没有默认的解析器实现
,因为应用程序可能会选择自己解析其多部分请求。要定义实现,请在DispatcherServlet的应用程序上下文中创建一个ID为“
multipartResolver”的bean。这样的解析器将应用于该DispatcherServlet处理的所有请求。
对于配置了xml的应用程序,它将看起来接近以下内容:
<bean id="multipartResolver" />
对于配置了注释的应用程序,它将看起来与以下内容接近:
@Bean(name = "multipartResolver")public CommonsMultipartResolver createMultipartResolver() { return new PostAndPutCommonsMultipartResolver();}


