2010-05-29 15 views
8

Sto usando PHP per caricare file. Nel numero PHP manual mostra un esempio utilizzando un campo nascosto MAX_FILE_SIZE, dicendo che rileverà sul lato client (cioè il browser) se il file è troppo grande o no.Rilevamento delle dimensioni di caricamento dei file sul lato client?

Ho appena provato l'esempio in Firefox, Chrome e IE e non funziona. Il file viene sempre caricato, anche se è molto più grande del campo nascosto specificato.

Per inciso, se il file è più grande di MAX_FILE_SIZE, la chiamata a move_uploaded_file non funziona, quindi sembra che la variabile abbia un lato server, ma non sul lato client.

risposta

10

Su MAX_FILE_SIZE

Leggere questo:

... A http://pk.php.net/manual/en/features.file-upload.post-method.php ed equivalenti sedi in altri formati, si afferma che i browser assumono il valore di un campo di modulo in MAX_FILE_SIZE conto.

Queste informazioni si ripete altrove sul web e nei libri, ma sembra provenire dalla documentazione di PHP (è non appare in termini di altre tecnologie lato server).

Non c'è nulla in qualsiasi del codice HTML, HTTP o specifiche relative ad indicare che questo è il caso (in particolare RFC 1867, che ha introdotto il file arrivi in ​​HTML non menzionano, quindi non è anche un caso di un kludge che è stato menzionato nel primo RFC e poi lasciato cadere) e non rende il senso nel contesto delle specifiche HTML (non c'è nulla che indichi alcuna relazione tra quel particolare input nascosto e l'input del file) . Le uniche istruzioni sui campi nascosti che potevo trovare in ognuna di esse erano le avvertenze nelle sezioni sulle considerazioni di sicurezza relative agli agenti utente che basavano qualsiasi operazione relativa ai file su qualsiasi cosa menzionata in un campo nascosto .

Nessun browser sembra eseguire questa "estensione". Infatti dato che ci sono potenzialmente altri significati possibili per un campo nascosto con quel nome in un'applicazione che gestisce diversi caricamenti di file, sarebbe essere considerato un difetto di progettazione qualsiasi ha fatto.

Sottoscrivo che non esiste un tale meccanismo nei browser tradizionali (se esiste uno qualsiasi ) e in effetti non dovrebbe esserlo. Il riferimento ad esso dovrebbe essere lasciato cadere dalla documentazione .

Suggerirei inoltre che poiché questa idea è stata propagata da questa documentazione altrove, una nota su di esso non funzionante deve essere aggiunta a .

Se è necessario o desiderato per più rapidamente la gestione di questo sorta di gestire file di emissione di un meccanismo allora richiede funzionalità per permettere PHP di intercettare i flussi caricato prima della richiesta di completamento, che sarebbe completamente diverso da come questa documentazione suggeriscono si dovrebbe essere trattata, anche se fosse vero ...


il codice qui sotto provengono da implementazione php swfUpload:

// Check post_max_size (http://us3.php.net/manual/en/features.file-upload.php#73762) 
    $POST_MAX_SIZE = ini_get('post_max_size'); 
    $unit = strtoupper(substr($POST_MAX_SIZE, -1)); 
    $multiplier = ($unit == 'M' ? 1048576 : ($unit == 'K' ? 1024 : ($unit == 'G' ? 1073741824 : 1))); 

    if ((int)$_SERVER['CONTENT_LENGTH'] > $multiplier*(int)$POST_MAX_SIZE && $POST_MAX_SIZE) { 
     header("HTTP/1.1 500 Internal Server Error"); 
     echo "POST exceeded maximum allowed size."; 
     exit(0); 
    } 
// Validate the file size (Warning the largest files supported by this code is 2GB) 
    $max_file_size_in_bytes = 2147483647;   
    $file_size = @filesize($_FILES[$upload_name]["tmp_name"]); 
     if (!$file_size || $file_size > $max_file_size_in_bytes) { 
      HandleError("File exceeds the maximum allowed size"); 
      exit(0); 
     } 
+0

+1; buona investigazione – strager

+0

'è necessario verificare che il file caricato sia inferiore a MAX_FILE_SIZE usando PHP' no, non lo si. Basta sbarazzarsi di questo campo inutile –

+0

"richiede funzionalità per consentire a PHP di intercettare i flussi caricati prima del completamento della richiesta" -> PHP può intercettare la richiesta se la sua lunghezza supera il limite specificato in 'post_max_size', ma richiede al browser di inviare l'intestazione della richiesta contenente 'Content-Length', e dai browser moderni solo Opera sembra che stia inviando questa intestazione. –

3

Per quanto ne so non c'è soluzione semplice e cross-browser per raggiungere questo obiettivo. Le uniche soluzioni funzionanti sono basate su Flash o Java poiché queste tecnologie possono accedere al filesystem e ottenere informazioni sui file.

Script di esempio: YUI2 Uploader, FancyUpload, SWFUpload

+0

Inoltre, c'è Uploadify (http://www.uploadify.com/) per il caricamento di file HTML5 –

6

Questo funziona probabilmente solo su Firefox 3.6, per ora:

<script type="text/javascript"> 
    function checkSize() 
    { 
     var input = document.getElementById("upload"); 

     // check for browser support (may need to be modified) 
     if(input.files && input.files.length == 1) 
     {   
      if (input.files[0].fileSize > 1024) /* or maybe .size */ 
      { 
       alert("The file must be less than 1KB"); 
       return false; 
      } 
     } 

     return true; 
    } 
</script> 


<form method="post" enctype="multipart/form-data" onsubmit="return checkSize()">  
    <input type="file" id="upload" /> 
    <input type="submit" /> 
</form> 

Vedi http://www.w3.org/TR/FileAPI/.

1

Se si utilizza correttamente il campo nascosto MAX_FILE_SIZE, il caricamento del file si interrompe solo quando la dimensione caricata raggiunge il valore specificato. E così risparmia agli utenti la fatica di aspettare il trasferimento di un grosso file. È necessario verificare se il caricamento del file è stato arrestato, sul lato server utilizzando lo error code generato.

if($_FILES['userfile']['error'] == 2) 
{ 
die("Maximum file size Exceeded"); 
} 
Problemi correlati