PHP警告:POST内容 - n字节的长度超过了第0行中未知数的3145728字节的限制

问题描述:

在我的错误日志中找到上述错误令人惊讶,因为我认为我已经完成了必要的工作捕获错误在我的PHP脚本:PHP警告:POST内容 - n字节的长度超过了第0行中未知数的3145728字节的限制

if ($_FILES['image']['error'] == 0) 
{ 
// go ahead to process the image file 
} 
else 
{ 
// determine the error 
switch($_FILES['image']['error']) 
{ 
    case "1": 
    $msg = "Uploaded file exceeds the upload_max_filesize directive in php.ini."; 
    break; 
    .... 
} 
} 

在我的php.ini脚本,相关设置:

memory_limit = 128M 
post_max_size = 3M 
upload_max_filesize = 500K 

据我所知,3M相当于3145728个字节,这是什么,正在触发错误。如果文件大小大于500k但小于3M,则PHP脚本将能够按照正常运行,按照case 1发出$msg中的错误消息。

当帖子大小超过post_max_size但仍然在内存限制内时,如何捕获此错误而不是让脚本突然终止并显示PHP警告?我看过类似的问题here,herehere,但找不到答案。

+0

为什么不将函数包装在'try..catch'块中? – inhan 2012-07-31 11:34:05

+0

'error_reporting(E_ALL&〜E_WARNING);'关闭PHP警告。 – fdomig 2012-07-31 11:39:27

+0

@fdomig这应该是绝对的最后的手段。 – 2012-07-31 11:48:17

找到一个替代的解决方案,不与错误直接处理。下面的代码是由软件工程师安德鲁Curioso在他blog写:

if($_SERVER['REQUEST_METHOD'] == 'POST' && empty($_POST) && 
    empty($_FILES) && $_SERVER['CONTENT_LENGTH'] > 0) 
{ 
    $displayMaxSize = ini_get('post_max_size'); 

    switch(substr($displayMaxSize,-1)) 
    { 
    case 'G': 
     $displayMaxSize = $displayMaxSize * 1024; 
    case 'M': 
     $displayMaxSize = $displayMaxSize * 1024; 
    case 'K': 
     $displayMaxSize = $displayMaxSize * 1024; 
    } 

    $error = 'Posted data is too large. '. 
      $_SERVER[CONTENT_LENGTH]. 
      ' bytes exceeds the maximum size of '. 
      $displayMaxSize.' bytes.'; 
} 

正如在他的文章中,当投递大小超过post_max_size$_POST$_FILES超全局数组将成为空解释。因此,通过测试这些错误并确认使用POST方法发送了一些内容,可以推断出发生了这样的错误。

实际上有一个类似的问题here,我以前找不到。

在上传甚至发生之前,您可以先用javascript对其进行检查吗?

// Assumed input for file in your HTML 
<input type="file" id="myFile" /> 


//binds to onchange event of your input field 
$('#myFile').bind('change', function() { 
    alert(this.files[0].size); 
}); 

您也可以弹出一个尝试捕捉周围:

try 
{ 
    if (!move_uploaded_file('blah blah')) 
    { 
     throw new Exception('Too damn big.'); 
    } 
    // Can do your other error checking here... 
    echo "Upload Complete!"; 
} 
catch (Exception $e) 
{ 
    die ('File did not upload: ' . $e->getMessage()); 
} 
+1

用户可能没有启用javascript。 – 2012-07-31 11:25:38

+0

+1这可能不能完全解决问题,但一个很好的建议。 – Rab 2012-07-31 11:28:18

+0

@QuestionOverflow虽然是正确的,但是发生这种情况的几率是百万分之一,因为今天需要启用JS的所有东西。我很难找到一个JS失效的人 – asprin 2012-07-31 11:28:20