【问题标题】:Detecting and handling POST requests greater than post_max_size [duplicate]检测和处理大于 post_max_size 的 POST 请求 [重复]
【发布时间】:2020-12-31 21:59:19
【问题描述】:

我正在开发的一个 PHP 站点有一个表单,允许用户在编辑对象时上传零个或多个文件。作为测试表单的一部分,我尝试上传总请求大小超过post_max_size 的文件。

这会导致在服务器日志中生成以下条目:

PHP Warning:  POST Content-Length of 182213631 bytes exceeds the limit of 16777216 bytes in Unknown on line 0

$_POST 数组也是空的。

我可以接受警告,但是空的$_POST 数组会导致问题,因为它通常包含有关请求的一些其他信息,例如正在编辑的对象的 ID。这会阻止网站显示有用的错误消息,包括对象的名称等(例如,“您尝试编辑对象 X,但您上传的文件太大”)。

有没有办法在 PHP 中检测和处理这个特定问题?如果文件太大,表单确实有一些 JavaScript 来显示警告,但这仅在浏览器支持 File API 时才有效(并非全部支持),用户经常忽略警告,一般我尝试复制任何客户端检查服务器,因为绕过客户端检查很简单。

我知道我可以增加 post_max_size 并且知道如何做到这一点,但问题是优雅地处理超过该大小的上传。

PHP 版本:5.6.40(我知道这是不支持的,但升级并不容易或完全在我的控制之下)

【问题讨论】:

    标签: php


    【解决方案1】:

    也许是这样的:

    if ($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) &&
         empty($_FILES) && $_SERVER['CONTENT_LENGTH'] > 0){
       echo "POST data size exceeded!";
    }
    

    请注意,当出现该错误时,您无法区分文件和其他变量。正在计算对象长度的总和,当超过时,$_POST 始终为空。因此,如果您想保留其他参数,您可能应该将它们添加到$_GET,例如:

    <form action="post.php?param1=1&param2=2" ... />
    

    或通过更改 ajax 请求的 URL。

    编辑:哦,他们在PHP documentationpost_max_size 中说了同样的话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2010-12-08
      • 1970-01-01
      • 2019-11-09
      • 2016-06-18
      • 1970-01-01
      相关资源
      最近更新 更多