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-Length是10000字节,但我只发送一个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请求标题显示,但有没有办法检查收到的实际内容长度?
我猜远程客户端实际上是一个带有 HTML 页面的浏览器。否则,请告诉我,我会尝试调整我的解决方案。
您可以添加字段<input type="hidden" name="complete">(例如)作为最后一个参数。首先检查PHP该参数是否是客户端发送的。如果发送此参数 - 您可以确定您获得了完整的数据。
现在,我不确定是否必须根据 RFC(HTML 和 HTTP)保留参数的顺序。但我尝试了一些变化,我发现订单确实保留了。
更好的解决方案是,计算(在客户端)参数的哈希值并将其作为另一个参数发送。所以您可以绝对确定您获得了完整的数据。但这听起来开始变得复杂......
| 归档时间: |
|
| 查看次数: |
4703 次 |
| 最近记录: |