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

标签 php apache post multipartform-data content-length

当连接速度较慢的远程 Web 客户端无法发送包含 multipart/form-data 内容的完整 POST 请求时,我遇到了一个问题,但 PHP 仍然使用部分接收到的数据来填充 $_POST 数组。因此,$_POST 数组中的一个值可能不完整,并且可能缺少更多值。我试图在 Apache list 中问同样的问题首先得到an answer Apache 不会缓冲请求主体并将其作为 巨大的 Blob 。

这是我的示例 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-Length10000 字节,但我只发送了一个 var 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 中验证是否已完全收到发布请求? $_SERVER['CONTENT_LENGTH'] 会显示请求 header 中的 10000,但是有没有办法检查收到的实际内容长度?

最佳答案

I guess that the remote client is actually a browser with HTML page. otherwise, let me know and i'll try to adapt my solution.

您可以添加字段<input type="hidden" name="complete"> (例如)作为 last 参数。在 PHP首先检查此参数是否从客户端发送。如果发送了此参数 - 您可以确定您获得了全部数据。

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

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

关于php - 如何在 PHP 中检查不完整的 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20255408/

相关文章:

php - 从 MySQL 中以正确的精度选择 float

javascript - 为什么重定向 404 错误会导致 js 文件返回 HTML?

php - 在同一页面添加mysql和删除

php - 如何替换 Netbeans 中的字符串?

java - 可移植开源 Java Web 服务器推荐?

PHP 5.5.6 随机内存泄漏

使用 HttpUrlConnection 获取 "already connected"的 Android POST 请求

node.js - app.post的第一个字符串参数有什么作用?

json - 使用 Express 和 Postman 同时发布多个 JSON 对象

php - 替换为空格 CKEditor