检测和处理大于POST_max_size的POST请求



我正在开发的一个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(我知道这已经不支持了,但升级并不容易,也不完全在我的控制之下(

也许是这样的:

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。

编辑:哦,他们在post_max_size的PHP文档中也说了同样的话。

最新更新