当连接速度较慢的远程 Web 客户端无法发送完整的 POST 请求时,我遇到了问题multipart/form-data
内容,但 PHP 仍然使用部分接收到的数据来填充$_POST
大批。结果一个值$_POST
数组可能不完整,并且可能会丢失更多值。我试着问同样的问题阿帕奇列表 http://mail-archives.apache.org/mod_mbox/httpd-users/201311.mbox/%3C52964F20.8030004@gmail.com%3E首先并得到了一个答案 http://mail-archives.apache.org/mod_mbox/httpd-users/201311.mbox/%3CCALK=YjNuBzrwHgOj6VVSyFia+3LSxX4JXxJTUuu6WUqLNwaRmQ@mail.gmail.com%3EApache 不会缓冲请求正文并将其作为 PHP 模块传递给 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
你可以看到Content-Length
is 10000
字节,但我只发送一个变量a=A
.
PHP 脚本是:
<?php print_r($_REQUEST); ?>
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
)
所以这是我的问题:如何在 PHP 中验证 post 请求是否已完全收到?$_SERVER['CONTENT_LENGTH']
会显示10000
从请求标头,但是有没有办法检查收到的实际内容长度?
我猜远程客户端实际上是一个带有 HTML 页面的浏览器。
否则,请告诉我,我会尝试调整我的解决方案。
您可以添加字段<input type="hidden" name="complete">
(例如)作为last范围。在PHP
首先检查该参数是否是客户端发送的。如果发送此参数 - 您可以确定您获得了完整的数据。
现在,我不确定是否必须根据 RFC(HTML 和 HTTP)保留参数的顺序。但我尝试了一些变化,我发现订单确实保留了。
更好的解决方案是,计算(在客户端)参数的哈希值并将其作为另一个参数发送。所以您可以绝对确定您获得了完整的数据。但这听起来开始变得复杂......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)