使用 GET 方法上传文件

Posted

技术标签:

【中文标题】使用 GET 方法上传文件【英文标题】:File uploading using GET Method 【发布时间】:2013-02-18 13:34:45 【问题描述】:

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

【问题讨论】:

因为 URL 大致限制为 2000 个字符...试图将整个文件压缩到其中...不是最聪明的主意... 加上文件必须是url_encoded,这也不是一个聪明的主意 主要是因为GET用于获取信息,而POST用于发布到服务器。基本上,GET 只用于不改变服务器上任何东西的事情,而 POST 只用于那些做的事情。 当数据是 GET 的参数时,在 GET 命令中上传数据非常有意义。例如。要获取的资源 ID 的 JSON 编码列表。感谢以下澄清! 除了长 URL 之外,通过 GET 上传图片以进行“相似图片”搜索似乎非常明智。 【参考方案1】:

GET方法的情况

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

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

【讨论】:

【参考方案2】:

GET 请求可能包含实体主体

RFC 2616 不阻止实体主体作为 GET 请求的一部分。这经常被误解,因为 php 用它的 名字不好 $_GET superglobal 搅浑了水。 $_GET 在技术上与 HTTP GET 请求方法无关——它只不过是请求 URI 查询字符串中的 url 编码参数的键值列表。即使请求是通过 POST/PUT/etc 发出的,您也可以访问 $_GET 数组。很奇怪,对吧?不是一个很好的抽象,是吗?

为什么 GET 实体是个坏主意

那么spec say about the GET method... 是什么意思:

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

因此,使用 GET 最重要的是确保任何 GET 请求都是安全的。尽管如此,禁令仍然是 只有 "SHOULD NOT" ...从技术上讲,HTTP 仍然允许 GET 请求导致不 严格基于“检索”。

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

当 GET 实体完全错误时

关于幂等性,规范说:

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

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

如有疑问,请在评估功效时始终回退到安全性/幂等性测试 方法及其产生的副作用。

【讨论】:

你好。如果请求的最终目的是检索信息。例如,如果我有一个接受文件的端点并将文件中的第一行作为 JSON 响应返回。那我为什么不让它成为 GET 呢? 我第二个@variable。它认为在这种情况下,安全性和幂等性都得到了保留。

以上是关于使用 GET 方法上传文件的主要内容,如果未能解决你的问题,请参考以下文章

关于AsyncHttpClient框架的post 提交表单上传文件怎么弄

本地文件上传到Linux服务器的几种方法

Servlet 文件上传

使用ajax发送文件的三种方式及预览图片的方法,上传按钮美化

上传文件

php上传文件为啥一定要用post