2012-07-31 13 views
9

Jestem dość zaskoczony, aby znaleźć wyżej wspomniany błąd w moim dzienniku błędów, ponieważ myślałem, że już zrobiłem niezbędne prace do złapać błąd w moim skrypcie PHP:Ostrzeżenie PHP: POST Zawartość-Długość n bajtów przekracza limit 3145728 bajtów w Nieznany w linii 0

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

w moim scenariuszu php.ini, odpowiednie są następujące ustawienia:

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

rozumiem, że 3M jest równoważna 3145728 bajtów i że to, co to uruchamia błąd. Jeśli rozmiar pliku przekracza 500 tys., Ale mniej niż 3M, skrypt PHP będzie mógł działać zgodnie z normą, wydając komunikat o błędzie pod numerem $msg zgodnie z case 1.

Jak złapać ten błąd zamiast pozwolić, aby skrypt nagle przerwał ostrzeżenie PHP, gdy rozmiar post przekroczy post_max_size, ale nadal w granicach limitu pamięci? Spojrzałem na podobne pytania: here, here i here, ale nie mogłem znaleźć odpowiedzi.

+0

Dlaczego nie zawiniecie swojej funkcji w bloku 'try..catch'? – inhan

+0

'error_reporting (E_ALL i ~ E_WARNING);' aby wyłączyć ostrzeżenia PHP. – fdomig

+0

@fdomig To powinno być absolutną ostatnią deską ratunku. –

Odpowiedz

14

Znaleziono alternatywne rozwiązanie, które nie zajmuje się bezpośrednio z błędu. Poniższy kod został napisany przez Andrew Curioso inżynier oprogramowania w Jego 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.'; 
} 

Jak wyjaśniono w swoim artykule, gdy rozmiar przekracza post_max_size poczta, Super globalne tablice $_POST i $_FILES będzie pusta. Tak więc, testując je i potwierdzając, że istnieje pewna zawartość wysyłana za pomocą metody POST, można wywnioskować, że taki błąd wystąpił.

Istnieje rzeczywiście podobne pytanie here, którego nie udało mi się znaleźć wcześniej.

1

Można to sprawdzić za pomocą javascript najpierw, zanim jeszcze zostanie przesłane wideo?

// 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); 
}); 

Można również pop try catch wokół niego:

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

Użytkownik może nie mieć włączonego javascript. –

+0

+1 może to nie w pełni rozwiązać problem, ale dobrą sugestię. – Rab

+0

@QuestionOverflow Chociaż jest to prawda, ale szanse na to się zdarzają są 1 na milion, ponieważ wszystko, co dziś jest potrzebne, wymaga włączenia JS. Trudno byłoby znaleźć kogoś z JS wyłączonym – asprin

Powiązane problemy