2012-07-31 104 views
9

在我的錯誤日誌中找到上述錯誤令人驚訝,因爲我認爲我已經完成了必要的工作捕獲錯誤在我的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

回答

14

找到一個替代的解決方案,不與錯誤直接處理。下面的代碼是由軟件工程師安德魯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,我以前找不到。

1

在上傳甚至發生之前,您可以先用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

相關問題