如何防止警告:POST内容长度和内存大小

时间:2014-02-11 14:42:33

标签: php post file-upload filesize max-size

目前,当用户上传照片时,该页面显示“警告: XXX 字节的POST内容长度超过了第0行未知中21000000字节的限制”。

我知道这意味着什么,我不是在寻找像增加max_upload值甚至memory_size_limit这样的解决方案......因为即使你明确告诉用户,用户可能会和用户 上传数TB的废话它们只有最多20MB的文件,只允许使用图像。

我正在寻找解决方案:

  • 如何防止此警告甚至发生? 至少或者是:
  • 如何阻止显示此警告?

编辑:请仔细阅读! - 请理解当然我正在处理错误/警告之后(从第1行开始),问题是这发生在虚拟的“第0行”这就是我需要的原因隐藏错误或阻止错误 - 因为我无法在发生错误的地方放置任何代码。

EDIT2:经过长时间的研究和挖掘,我得到了一个想法 - 它有效 - 看看我自己的答案。

7 个答案:

答案 0 :(得分:11)

因此,在搜索而不是今天工作之后,我终于知道如何解决这个问题,它有效,甚至没有造成太大的伤害。但在做之前,请先了解你在做什么。 :)正如我在其中一条评论中建议的那样,真的可以在.htacess中关闭PHP错误 - 只需关闭PHP启动警告。

在应用解决方案之前:

请注意:将此代码插入.htaccess后,您将无法看到任何  启动错误

另请注意:“0”行的启动错误多于此行。

之前执行:在执行此操作之前,您应该以检查上传内容大小和向用户提供正确信息的方式准备脚本。警告没有显示这一事实意味着您不应对此做任何事情。这意味着完全相反 - 你应该尽一切可能做出至少接近警告加注的东西 - 检查,仔细检查你是否可以,处理错误并提出你自己的错误信息。

将此添加到.htaccess:

<强> php_flag display_startup_errors off

它似乎不是那么邪恶:

请注意,这会关闭启动错误
因此所有常规PHP错误/警告/通知都保持开启:)

甚至XAMPP的PHP“本身”也推荐它用于制作:

php.ini文件文字说:

; display_startup_errors
;   Default Value: Off
;   Development Value: On
;   Production Value: Off

PS:“启动错误”似乎是错误之前 PHP脚本自身执行 - 这些错误通常会试图“说服”你他们在第0行

感谢我的想法和答案:How to disable notice and warning in PHP within .htaccess file?

编辑:由于这是一个php_flag设置,如果您有PHP的自定义安装,您当然也可以在php.ini中默认设置它:)

答案 1 :(得分:4)

问题是

  

如何防止警告:POST内容长度

答案是,在不编辑任何配置值的情况下,将此代码放在将接收要处理的表单的文件的最开头:

 <?php // here start your php file
 ob_get_contents();
 ob_end_clean();

就是这样。没有更多警告,以及您不希望在页面上输出的任何其他内容。 之后,正如其他地方所建议的那样,您可以决定如何处理:

if($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) && empty($_FILES) && $_SERVER['CONTENT_LENGTH'] > 0){ echo"WoW your file is too big!"; }

也许还会对文件进行分块,如果以另一种方式传递关于要由Php处理的文件的正确值。

如此处Warning: POST Content-Lenght ...

所述

答案 2 :(得分:1)

我遇到了类似的问题,并想知道你是否找到了满意的解决方案。目前,我的'PHP警告:POST Content-Length为21010354字节超过限制为8388608'在日志中,我认为我无能为力。

我在Zend框架内工作,当用户上传文件时,它基本上会杀死所有常见的POST数据解析,因此对getParams()的响应不包含任何常用的POST参数。这意味着用户收到验证错误,说其中一个字段丢失,这是误导性的。

在研究这个时,我发现了一些你可能想看的有趣的php_ini设置,特别是enable_post_data_reading和always_populate_raw_post_data。在我的情况下,我正在上传一个20M的文件,最大8M的帖子和10M的上传文件,并且php://输入的结果似乎是20M文件的完整,即使帖子数据现在是空的。

因此,我将手动检查原始数据是否超出限制,并假设一切都失败(如果它已经(并保释))。我建议您可以编写自己的代码来解析原始数据,以填充$ _POST数据。然后,您可以根据需要启动代码,并且只有在您准备好时,检查用户是否上传了超出限制的数据。这取决于你,然后在解析它之前返回一个错误,或者如果没关系,解析它。只要您将PHP帖子和上传限制设置为高于您的用户限制,就应该允许用户违反规则,允许您的代码检测后膛并抱怨它。

答案 3 :(得分:1)

这是真正的解决方案,可以正确防止此错误。

在php.ini中设置此参数:

enable_post_data_reading = On
upload_max_size=0
post_max_size=0

警告:请务必在表单中填写此行

<input type="hidden" name="MAX_FILE_SIZE" value="2048576" />

最重要的是:

  • 请务必检查$ _FILES [&#39;文件&#39;] [&#39;错误&#39;]

  • 的代码错误
  • 请务必在PHP中检查上传的大小

答案 4 :(得分:0)

正如您已经发现的那样,在PHP中无法做到这一点,因为PHP只能从第1行开始捕获错误。

唯一的办法是挖掘PHP源代码,找到抛出错误的位置,并在编译服装php版本之前从PHP源中删除该部分。

但请注意,出于某种原因会抛出错误消息。

答案 5 :(得分:-3)

要防止发生此错误,您必须先检查上传文件的大小,如果它们很大,您必须取消上传!

如果你用你的PHP脚本编写

,我认为它就足够了
error_reporting(0);

答案 6 :(得分:-5)

1.您可以在使用JavaScript上传之前检查文件大小,但这可能会被篡改!

2.在上传后<保存文件之前检查文件大小。

<?php

$size = filesize($uploaded_file);
if($size > $your_size_limit)
{
    echo "Throw bunch of errors";
}
else
{
    //save it
}
?>

3.不要试图隐藏错误来解决问题。