Rilevare le dimensioni del caricamento dei file sul lato client?

Sto usando PHP per i caricamenti di file. Nel manuale PHP mostra un esempio usando un campo nascosto MAX_FILE_SIZE , dicendo che rileverà sul lato client (cioè il browser) se il file è troppo big o meno.

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 chiamare move_uploaded_file non funziona, quindi sembra che la variabile abbia un effetto lato server, ma non sul lato client.

Su MAX_FILE_SIZE

Leggi questo:

… A http://pk.php.net/manual/en/features.file-upload.post-method.php e posizioni equivalenti in altri formati, si afferma che i browser prendono il valore di un campo modulo MAX_FILE_SIZE in account.

Questa informazione viene ripetuta 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 nessuna delle specifiche HTML, HTTP o correlate per indicare che questo è il caso (in particolare RFC 1867 che ha introdotto upload di file in HTML non ne parla , quindi non è nemmeno il caso di un kludge che era menzionato nel primo RFC e poi abbandonato) e non ha 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 contro gli user-agent 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, dovrebbe essere considerato un difetto di progettazione.

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

Suggerirei inoltre che poiché questa idea si è propagata da questa documentazione altrove, è necessario aggiungere una nota che non funziona.

Se è necessario o richiesto un meccanismo per gestire più rapidamente questo tipo di problema di gestione dei file, allora richiede funzionalità per consentire a PHP di intercettare gli stream che vengono caricati prima del completamento della richiesta, che sarebbe completamente diverso da come questa documentazione suggerisce che dovrebbe essere affrontata, anche se fosse vero …


il codice seguente proviene dall’implementazione di phfUpload per PHP:

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

Questo probabilmente funziona solo su Firefox 3.6 per ora:

  

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

Per quanto ne so, non esiste una semplice soluzione cross-browser per raggiungere questo objective. 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: Uploader YUI2 , FancyUpload , SWFUpload

Se stai utilizzando il campo nascosto MAX_FILE_SIZE correttamente, 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 viene interrotto, sul lato server utilizzando il codice di errore generato.

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