1

我正在开发一个包含小型 REST API 的应用程序。其中一种方法需要接受 PUT 请求上的大型(近 300MB)二进制文件上传。

由于该文件非常大,并且由于同时运行多个此类请求存在一定风险,因此我想避免将整个请求正文保存在内存中。我曾希望通过php://input直接从流中读取并将其虹吸到文件中来做到这一点。

但是,控制器的input()方法似乎有干扰。我理解其中的基本原理——input()一旦你阅读了php://input流,它就消失了,所以input()保留它以重复访问。显然,这是我希望在这种情况下绕过的行为。

不过,在我的控制器代码运行之前,它似乎input()在某处被调用,因为当我到达时php://input,已经没有什么可读的了。

所以,我的问题是:CakePHP 控制器有没有办法将一个非常大的请求体流式传输到磁盘上,而无需先将整个请求体加载到内存中?

4

1 回答 1

0

我想通了,所以我希望以下内容可以节省其他人一些时间。

结果证明这是我的一个错误,但与 CakePHP 无关。如果您php://input在没有调用的情况下从控制器读取Controller::input(),您将(通常)按预期获得原始请求正文。

我的问题是我无意中设置了请求标头Content-Type: application/json。这导致 CakePHP 的 REST 代码尝试将正文解析为输入。当我正确设置类型(在我的情况下application/x-gzip)时,一切正常。

于 2013-02-22T17:04:39.140 回答