2012-05-10 8 views
5

Esistono due modi per utilizzare Apache FileUpload Library.Determinare la dimensione di un caricamento di file prima di leggerlo tutto nell'API Apache FileUpload Streaming

FileUpload

http://commons.apache.org/fileupload/using.html

e streaming FileUpload API

http://commons.apache.org/fileupload/streaming.html

Entrambi funzionano molto bene, tranne che l'API di streaming non sembra avere un modo per controllare la dimensione del file prima di elaborare il ruscello.

Ciò è dovuto al fatto che l'API di streaming non conosce fondamentalmente la dimensione del file o perché devo leggere manualmente alcune intestazioni o qualcosa per ottenere la dimensione di caricamento Multipart?

risposta

14

Non c'è modo di conoscere la dimensione di una parte di una richiesta multipart senza consumare l'intero corpo della richiesta HTTP. E una volta iniziato il consumo del corpo della richiesta HTTP, non puoi smettere di consumarlo a metà. Deve essere consumato fino all'ultimo byte prima che una risposta possa mai essere restituita. Questa è solo la natura di HTTP e TCP/IP. Per mantenere basso l'utilizzo della memoria del server, tuttavia è possibile scartare i byte letti quando superano le dimensioni (ad esempio, controllarli all'interno del ciclo di lettura e non assegnarli a nessuna variabile).

La soluzione migliore è convalidare la lunghezza del file in JavaScript prima che il caricamento abbia luogo. Questo è supportato nei browser supporting HTML5 File API. Le versioni correnti di Firefox, Chrome, Safari, Opera e Android lo supportano. IE9 non lo supporta ancora, lo sarà nel futuro IE10.

<input type="file" ... onchange="checkFileSize(this)" /> 

Qualora il checkFileSize() aspetto qualcosa di simile

function checkFileSize(inputFile) { 
    var max = 10 * 1024 * 1024; // 10MB 

    if (inputFile.files && inputFile.files[0].size > max) { 
     alert("File too large."); // Do your thing to handle the error. 
     inputFile.value = null; // Clear the field. 
    } 
} 
+0

Con il dovuto rispetto per Balus ... sul lato server, dal momento che l'OP chiede a tale proposito e non sul (JS) lato client. .. questo non è un buon modo per controllare. L'intestazione "Content-Length" è impostata dal client e non può o non deve essere considerata attendibile. Sul lato server, utilizzando l'API di streaming più il "Content-Length" dall'intestazione, si può determinare quanto grande il file "potrebbe essere" basato su: ContentLength (sum) - byte di intestazione letti fino all'avvio dell'elemento file raggiunto nella richiesta multiparte. Utilizzando l'API di streaming, leggi i blocchi e somma per proteggere da un caricamento troppo grande. –