如何在PHP中检查不完整的POST请求

spa*_*tar 8 php apache post multipartform-data content-length

当连接速度较慢的远程Web客户端无法发送带有multipart/form-data内容的完整POST请求但PHP仍然使用部分接收的数据来填充$_POST数组时,我遇到了问题.因此,$_POST数组中的一个值可能不完整,可能会丢失更多值.我首先尝试在Apache列表中提出相同的问题并得到一个答案,Apache不会缓冲请求体并将其作为巨型blob传递给PHP模块.

这是我的示例POST请求:

POST /test.php HTTP/1.0
Connection: close
Content-Length: 10000
Content-Type: multipart/form-data; boundary=ABCDEF

--ABCDEF
Content-Disposition: form-data; name="a"

A
--ABCDEF
Run Code Online (Sandbox Code Playgroud)

你可以看到这Content-Length10000字节,但我只发送一个var a=A.

PHP脚本是:

<?php print_r($_REQUEST); ?>
Run Code Online (Sandbox Code Playgroud)

对于我的剩余请求,Web服务器等待大约10秒钟(但我没有发送任何内容),然后返回此响应:

HTTP/1.1 200 OK
Date: Wed, 27 Nov 2013 19:42:20 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.4-14+deb7u3
Vary: Accept-Encoding
Content-Length: 23
Connection: close
Content-Type: text/html

Array
(
     [a] => A
)
Run Code Online (Sandbox Code Playgroud)

所以这是我的问题:如何在PHP中验证邮件请求是否已完全收到?$_SERVER['CONTENT_LENGTH']将从10000请求标题显示,但有没有办法检查收到的实际内容长度?

MeN*_*eNa 3

我猜远程客户端实际上是一个带有 HTML 页面的浏览器。否则,请告诉我,我会尝试调整我的解决方案。

您可以添加字段<input type="hidden" name="complete">(例如)作为最后一个参数。首先检查PHP该参数是否是客户端发送的。如果发送此参数 - 您可以确定您获得了完整的数据。

现在,我不确定是否必须根据 RFC(HTML 和 HTTP)保留参数的顺序。但我尝试了一些变化,我发现订单确实保留了。

更好的解决方案是,计算(在客户端)参数的哈希值并将其作为另一个参数发送。所以您可以绝对确定您获得了完整的数据。但这听起来开始变得复杂......