如何优雅地处理超过 PHP 的 \`post_max_size\` 的文件?

新手上路,请多包涵

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

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

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

但如果它超过了 post_max_size ,我的脚本就会无提示地失败并返回到空白表单。

有什么办法可以捕捉到这个错误吗?

原文由 Nathan Long 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 487
2 个回答

文档中

如果发布数据的大小大于 post_max_size,则 \(_POST 和 \)_FILES 超全局变量为空。这可以通过多种方式进行跟踪,例如通过将 \(_GET 变量传递给处理数据的脚本,即 <form action="edit.php?processed=1">,然后检查 \)_GET[‘processed’] 是否放。

不幸的是,PHP 看起来并没有发送错误。由于它发送的是空的 $_POST 数组,这就是为什么您的脚本返回到空白表单的原因 - 它认为它不是 POST。 (相当糟糕的设计决定恕我直言)

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

似乎比较优雅的方法是比较 post_max_size 和 $_SERVER[‘CONTENT_LENGTH’]。请注意,后者不仅包括上传文件的大小加上发布数据,还包括多部分序列。

原文由 Matt McCormick 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 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...
}

原文由 AbdullahAJM 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏