9

我正在开发一个带有框架 3.2.3.RELEASE 的 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));
}

不是一件至关重要的事情,实际上只是使用 PUT 工作的 POST 方法.. 但我想了解为什么不考虑 PUT !

谢谢你的任何回复马可

4

2 回答 2

15

RFC 说

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

POST 请求中的 URI 标识将处理封闭实体的资源。该资源可能是一个数据接受进程,一个通往其他协议的网关,或者一个接受注释的单独实体。相比之下,PUT 请求中的 URI 标识了请求中包含的实体——用户代理知道 URI 的意图,服务器不得尝试将请求应用于其他资源。

所以 PUT 请求代表一个资源。
但是 multiparts 意味着单个主体中的多个资源。

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

在多部分消息的情况下,其中一个或多个不同的数据集组合在一个正文中,“多部分”内容类型字段必须出现在实体的标题中。然后主体必须包含一个或多个“主体部分”,每个部分前面都有一个封装边界,最后一个后面是一个闭合边界。

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

于 2013-12-04T23:58:52.133 回答
1

PUT 指的是单个资源,例如一个文件。因此,根据定义,多部分形式与 PUT 动词不匹配。

所以我猜他们对 POST 进行了这些检查,以便能够应用于 HTTP 规范: http ://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

我想您可能会争辩说,PUT 包含多个字段(包括一个或多个文件)的自定义对象应该没问题,它仍然可以被视为 REST 术语中的一种资源,但这似乎不是大多数实现者的解释方式.

于 2013-12-04T11:37:52.610 回答