Spring MVC Framework:具有PUT方法的MultipartResolver


问题内容

我正在开发一个带有框架3.2.3的spring mvc应用程序

在我的应用程序中,我使用StandardServletMultipartResolver处理Multipart,但是使用apache commons-
fileupload 1.3,情况是一样的。

我想知道为什么isMultipart方法的实现只考虑POST方法,而不考虑PUT方法。如果要更新实体和相关文件,则必须使用POST进行。

查看org.springframework.web.multipart.support.Standard ServletMultipartResolver:

public boolean isMultipart(HttpServletRequest request) {
    // Same check as in Commons FileUpload...
    if (!"post".equals(request.getMethod().toLowerCase()) ) {
        return false;
    }
    String contentType = request.getContentType();
    return (contentType != null && contentType.toLowerCase().startsWith("multipart/"));
}

而在org.apache.commons.fileupload.servlet.ServletFileU pload中,我有:

public static final boolean isMultipartContent(HttpServletRequest request) {
    if (!POST_METHOD.equalsIgnoreCase(request.getMethod() )) {
        return false;
    }
    return FileUploadBase.isMultipartContent(new ServletRequestContext(request));
}

并不是至关重要的事情,实际上只是使用POST方法对PUT起作用。.但是我想理解为什么不考虑PUT!

谢谢您的答复Marco


问题答案:

RFC说

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6

POST请求中的URI标识将处理封闭实体的资源。该资源可能是一个数据接受过程,某个其他协议的网关或一个接受注释的单独实体。相比之下,PUT请求中的URI标识请求中包含的实体-
用户代理知道要使用的URI,并且服务器绝不能尝试将请求应用于其他资源。

因此,PUT请求代表单个资源。
但是,多部分意味着在单个主体中具有多种资源。

http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html

对于多部分消息,其中将一个或多个不同的数据集组合在一个正文中,则“多部分”的Content-
Type字段必须出现在实体的标题中。然后,主体必须包含一个或多个“主体部分”,每个“主体部分”之前是封装边界,最后一个是“封闭”边界。

因此,根据PUT的语义,请求与多部分数据不匹配。由于POST请求的请求URI是“封闭实体的处理程序”,因此POST是匹配的。