如何优雅地处理超过PHP“post_max_size”的文件?

2022-08-30 07:55:53

我正在处理将文件附加到电子邮件的PHP表单,并尝试优雅地处理上传的文件太大的情况。

我了解到有两个设置会影响文件上传的最大大小:和.php.iniupload_max_filesizepost_max_size

如果文件的大小超过 ,PHP 将返回文件的大小为 0。没关系;我可以检查一下。upload_max_filesize

但是如果它超过 ,我的脚本会静默地失败并返回到空白形式。post_max_size

有没有办法抓住这个错误?


答案 1

文档中

如果帖子数据的大小大于 post_max_size,则 $_POST 和 $_FILES 超级全局为空。这可以通过多种方式进行跟踪,例如,通过将 $_GET 变量传递给处理数据的脚本,即<form action=“edit.php?processing=1”>,然后检查是否设置了 $_GET['processing']。

所以不幸的是,它看起来不像PHP发送错误。由于它发送了空的 $_POST 数组,这就是为什么你的脚本会返回到空白表单 - 它不认为它是一个 POST。

这个评论者也有一个有趣的想法。

似乎一种更优雅的方式是比较post_max_size和_SERVER美元['CONTENT_LENGTH']。请注意,后者不仅包括上传文件的大小和发布数据,还包括多部分序列。


答案 2

有一种方法可以捕获/处理超过最大帖子大小的文件,这是我的首选,因为它告诉最终用户发生了什么以及谁有错;)

if (empty($_FILES) && empty($_POST) &&
        isset($_SERVER['REQUEST_METHOD']) &&
        strtolower($_SERVER['REQUEST_METHOD']) == 'post') {
    //catch file overload error...
    $postMax = ini_get('post_max_size'); //grab the size limits...
    echo "<p style=\"color: #F00;\">\nPlease note files larger than {$postMax} will result in this error!<br>Please be advised this is not a limitation in the CMS, This is a limitation of the hosting server.<br>For various reasons they limit the max size of uploaded files, if you have access to the php ini file you can fix this by changing the post_max_size setting.<br> If you can't then please ask your host to increase the size limits, or use the FTP uploaded form</p>"; // echo out error and solutions...
    addForm(); //bounce back to the just filled out form.
}
else {
    // continue on with processing of the page...
}

推荐