2012-07-31 14 views
9

Sono abbastanza sorpreso di trovare l'errore sopra indicato nel mio log degli errori perché pensavo di aver già fatto il lavoro necessario per rilevare l'errore nel mio script PHP:Avviso PHP: contenuto POST-lunghezza di n byte supera il limite di 3145728 byte in Unknown sulla linea 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; 
    .... 
} 
} 

nel mio script php.ini, le impostazioni rilevanti sono:

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

capisco che la 3M è equivalente a 3.145.728 byte e che questo è ciò che sta facendo scattare l'errore. Se la dimensione del file è superiore a 500k ma inferiore a 3M, lo script PHP potrebbe essere eseguito normalmente, inviando il messaggio di errore in $msg come da case 1.

Come posso rilevare questo errore invece di lasciare che lo script termini bruscamente con un avviso PHP quando le dimensioni del post superano lo post_max_size ma rimangono comunque entro il limite di memoria? Ho esaminato domande simili here, here e here, ma non ho trovato risposta.

+0

Perché non si avvolge la funzione in un blocco 'try..catch'? – inhan

+0

'error_reporting (E_ALL & ~ E_WARNING);' per disattivare gli avvertimenti PHP. – fdomig

+0

@fdomig Questa dovrebbe essere l'ultima risorsa assoluta. –

risposta

14

trovato una soluzione alternativa che non si occupa con l'errore direttamente. Il seguente codice è scritto da un ingegnere del software Andrew Curioso nella sua 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.'; 
} 

Come spiegato nel suo articolo, quando la misura del perno supera post_max_size, gli array super-globali di $_POST e $_FILES diventerà vuoto. Quindi, testando questi e confermando che è stato inviato del contenuto utilizzando il metodo POST, è possibile dedurre che tale errore si è verificato.

In realtà esiste una domanda simile here, che non ho trovato in precedenza.

1

Si può verificare con javascript prima che il caricamento abbia luogo anche?

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

È possibile anche pop un tentativo di cattura intorno ad esso:

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

L'utente non può avere javascript abilitato. –

+0

+1 questo potrebbe non risolvere completamente il problema, ma un buon suggerimento. – Rab

+0

@QuestionOverflow Anche se è vero, ma le probabilità che ciò accada è di 1 su un milione, poiché tutto ciò che oggi richiede JS deve essere abilitato. Sarebbe difficile trovare qualcuno con il loro JS disabilitato – asprin