44

众所周知,文件上传最常使用POST方法来完成。那么,为什么该GET方法不能用于文件上传呢?是否有针对 HTTPGET上传的具体禁令?

4

2 回答 2

42

GET 请求可能包含实体主体

RFC 2616 不阻止将实体主体作为 GET 请求的一部分。这经常被误解,因为 PHP 以其名称不佳的 $_GETsuperglobal 混淆了水域。$_GET从技术上讲,它与 HTTPGET请求方法无关——它只不过是来自请求 URI 查询字符串的 url 编码参数的键值列表。$_GET即使请求是通过 POST/PUT/etc 发出的,您也可以访问该数组。很奇怪,对吧?不是一个很好的抽象,是吗?

为什么 GET 实体主体是个坏主意

那么规范对 GET 方法有什么看法......好吧:

特别是,已经建立了约定,即 GET 和 HEAD 方法不应该具有采取除检索之外的操作的意义。这些方法应该被认为是“安全的”。

所以 GET 的重要一点是确保任何 GET 请求都是安全的。尽管如此,禁令只是“不应该” ......从技术上讲,HTTP 仍然允许 GET 请求导致不严格基于“检索”的操作。

当然,从语义的角度来看,使用名为GET“获取”资源之外的方法执行操作也没有多大意义。

当 GET 实体主体完全错误时

关于幂等性,规范说:

方法还可以具有“幂等性”的属性,因为(除了错误或过期问题)N > 0 个相同请求的副作用与单个请求相同。GET、HEAD、PUT 和 DELETE 方法共享此属性。

这意味着 GET 方法不能对同一资源的多个请求产生不同的副作用。因此,无论作为 GET 请求的一部分存在的实体主体如何,副作用都必须始终相同。用外行的话来说,这意味着如果你发送一个带有实体主体的 GET 100 次,服务器就不能创建 100 个新资源。无论是发送一次还是发送 100 次请求都必须具有相同的结果。这严重限制了 GET 方法发送实体主体的有用性。

当有疑问时,在评估方法的有效性及其产生的副作用时,总是回退到安全性/幂等性测试。

于 2013-03-04T20:46:05.450 回答
-3

在 GET 方法的情况下

  1. 以名称/值对的形式将表单数据附加到 URL 中,并且 URL 的长度是有限的(3000 个字符)。
  2. 不能使用表单将文件内容放入 URL 参数中。所以使用 POST
  3. 在 Get 方法中,action 的值会附加一个 `?' 到它,然后附加表单数据集,使用“application/x-www-form-urlencoded”内容类型编码。用户代理然后遍历此 URI 的链接。在这种情况下,表单数据仅限于 ASCII 代码

因此,在 GET 方法中无法上传文件

于 2014-07-26T11:24:07.120 回答