Domanda

I browser Web inviano le dimensioni del file nell'intestazione http durante il caricamento di un file sul server? E in tal caso, è possibile rifiutare il file semplicemente leggendo l'intestazione e non attendere il completamento dell'intero processo di caricamento?

È stato utile?

Soluzione

http://www.faqs.org/rfcs/rfc1867.html

I client HTTP lo sono    incoraggiato a fornire la lunghezza del contenuto per l'input complessivo del file in modo che a    il server occupato potrebbe rilevare se i dati del file proposto sono troppo grandi per essere    elaborato ragionevolmente

Ma la lunghezza del contenuto non è richiesta, quindi non puoi fare affidamento su di essa. Inoltre, un utente malintenzionato può creare una lunghezza del contenuto errata.

Leggere il contenuto del file è l'unico modo affidabile. Detto questo, se la lunghezza del contenuto è presente ed è troppo grande, chiudere la connessione sarebbe una cosa ragionevole da fare.

Inoltre, il contenuto viene inviato come multipart, quindi la maggior parte dei framework moderni lo decodifica per primo. Ciò significa che non otterrai il flusso di byte di file fino a quando non verrà completato il framework, il che potrebbe significare "fino a quando l'intero file non verrà caricato".

Altri suggerimenti

EDIT: prima di andare troppo lontano, potresti voler controllare questa altra risposta basandoti sulla configurazione di apache: Uso di jQuery, Limitazione delle dimensioni del file prima del caricamento . la descrizione che segue è utile solo se hai davvero bisogno di un feedback ancora più personalizzato.

Sì, puoi ottenere alcune informazioni in anticipo, prima di consentire il caricamento dell'intero file.

Ecco un esempio di intestazione proveniente da un modulo con l'attributo enctype = " multipart / form-data " :

POST / HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.7,fr-be;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------886261531333586100294758961
Content-Length: 135361

-----------------------------886261531333586100294758961
Content-Disposition: form-data; name=""; filename="IMG_1132.jpg"
Content-Type: image/jpeg

(data starts here and ends with -----------------------------886261531333586100294758961 )

Hai l'intestazione Content-Length nell'intestazione e inoltre c'è Content-Type nell'intestazione della parte del file (ogni file ha la sua intestazione, che ha lo scopo della codifica multipart). Attenzione che è responsabilità del browser impostare un tipo di contenuto pertinente indovinando il tipo di file; non puoi garantirlo, ma dovrebbe essere abbastanza affidabile per il rifiuto anticipato (tuttavia è meglio controllare l'intero file quando è interamente disponibile).

Ora c'è un gotcha. Ho usato per filtrare file di immagine del genere, non sulla dimensione, ma sul tipo di contenuto; ma se desideri interrompere la richiesta il prima possibile, sorge lo stesso problema: il browser riceve la tua risposta solo quando viene inviata l'intera richiesta, incluso il contenuto del modulo e quindi i file caricati .

Se non desideri il contenuto fornito e interrompere il caricamento, non hai altra scelta che chiudere brutalmente il socket. L'utente vedrà solo una connessione "confusa" ripristinata dal peer " Messaggio. E questo fa schifo, ma è di progettazione.

Quindi vuoi usare questo metodo solo in caso di controlli asincroni in background (usando un timer che controlla il campo del file). Quindi ho avuto quell'hack:

  • Uso jquery per dirmi se il campo del file è cambiato
  • Quando viene scelto un nuovo file, disabilita tutti gli altri campi di file nello stesso modulo per ottenere solo quello.
  • Invia il file in modo asincrono (jQuery può farlo per te, utilizza un frame nascosto)
  • Sul lato server, controlla l'intestazione (content-length, content-type, ...), interrompi la connessione non appena ottieni quello che ti serve.
  • Imposta una variabile di sessione che dice se quel file era OK o meno.
  • Lato client, poiché il file viene caricato in un frame non si ottiene nemmeno alcun tipo di feedback se la connessione viene chiusa . La tua unica alternativa è un timer.
  • Sul lato client, un timer esegue il polling del server per ottenere uno stato per il file caricato. Sul lato server, hai impostato la variabile di sessione, rispediscilo al browser.
  • Il client ha il codice di stato; renderlo nel tuo modulo: messaggio di errore, segno di spunta verde / X rossa, qualunque cosa. Azzera il campo del file o disabilita il modulo, decidi tu. Non dimenticare di riattivare altri campi di file.

Abbastanza disordinato, eh? Se qualcuno di voi ha un'alternativa migliore, sono tutto orecchi.

  1. Non ne sono sicuro, ma non dovresti davvero fidarti di nulla inviato nell'intestazione, in quanto potrebbe essere simulato dall'utente.

  2. Dipende da come funziona il server. Ad esempio in PHP il tuo script non verrà eseguito fino al completamento del caricamento del file, quindi questo non sarebbe possibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top