2015-04-01 8 views
11

Ho una pagina molto semplice che include un elemento <input type="file">. Quando invio il modulo con un file selezionato, il server risponde con un foglio di calcolo che viene aperto in Excel (una "nuova finestra"). L'implicazione di questo comportamento è che la schermata iniziale e l'elemento di input sono ancora visibili in IE. Se cambio i dati sul disco del file selezionato e invio di nuovo il modulo, Internet Explorer carica i contenuti vecchi una seconda volta; le mie ultime modifiche non sono presenti nel contenuto inviato al server. Se seleziono di nuovo il file tramite il pulsante Sfoglia ..., i nuovi contenuti del file vengono caricati come previsto. Firefox invia sempre il contenuto del file dal disco, che è il comportamento previsto/desiderato. Sembra che Internet Explorer stia facendo un qualche tipo di memorizzazione nella cache dei contenuti del file caricato.Caricamenti di file nella cache di Internet Explorer?

C'è un modo per disabilitare questa "funzione" e IE estrarre i dati dal disco ogni volta che il modulo viene inviato?

C'è qualche documentazione disponibile su questo comportamento? È la prima volta che l'ho incontrato e le mie ricerche sono per lo più svuotate.

+0

E se non si memorizza nella cache il * upload * (di cui non ho mai sentito parlare e sarebbe davvero strano) ma il risultato generato? È questo il risultato che invia le intestazioni di cache appropriate (o, piuttosto, senza cache)? –

+0

@Pekka: i registri del server mostrano che il browser effettua una richiesta POST e restituisce un 200 OK per ogni tentativo di caricamento. Se si nascondesse la risposta nella cache, mi aspetterei che Internet Explorer salti la richiesta del tutto o che il server restituisca uno stato 304 non modificato. – Todd

+0

Quale tecnologia viene utilizzata sul lato server per gestire il caricamento e l'elaborazione del file? È possibile registrare i checksum dei file caricati per vedere se il browser sta effettivamente inviando il file sbagliato o se qualcosa di altro va storto sul lato server –

risposta

4

È possibile testare la congettura con live demos posted on MS-Connect.

[...] il bug è iniziato con IE10, quando sono stati implementati FileList e Blob.
input.files è un fileLista HTML5 di elementi file/BLOB.
Per popolarlo, IE blob ogni scelta di filepicker. Hanno uno "stato istantaneo" (termine W3C).
Vengono mantenuti sincronizzati nel caso in cui un file selezionato venga aggiornato prima dell'invio.
Il bug è, IE non riesce a rilevare se il file viene cancellato, rinominato o sostituito.
L'istantanea di filepicker diventa obsoleta in quella circostanza.

Ecco cosa succede quando si seleziona un file in filepicker, poi ribattezzata e modificati, prima di presentare la selezione filepicker. Sebbene un nuovo file (con nome file originale) sia stato sostituito al suo posto, il file originale (ora con diversonome e testo modificato) viene inviato nel modulo. Com'è possibile? È come se fosse tracciato tramite ntfs ObjectID, che viene utilizzato con Distributed Link Tracking. Nota attentamente in questo screenshot, il file nome non è d'accordo con il file contenuto.

Quindi, non è una cosa "caching" a tutti. È un bug di tracciamento.

0

Non l'ho provato da solo, ma è possibile provare a utilizzare un parametro fittizio per l'azione del modulo e modificarne il valore appena prima di ogni azione di invio. Ad esempio, se disponi di <form action="foo.php">, modificalo in <form action="foo.php?dummy=0"> e quindi utilizza javascript per modificare la parte dell'azione in modo che diventi es. action="foo.php?dummy=1" e così via poco prima di ogni invio.

1

Hai provato a utilizzare l'attributo autocomplete per il tag input?

Ad esempio

<input type="text" autocomplete="off" /> 

dovrebbe forzare valore da non essere riutilizzato come indicato in W3C docs:

completamento automatico = on/off/default

  • sulla - Lo stato attivo indica che il val ue non è particolarmente sensibile e l'utente può aspettarsi di poter contare sull'agente dell'utente per ricordare i valori che ha inserito per quel controllo.
  • spento - Lo stato spento indica che i dati di input del controllo sono particolarmente sensibili (ad esempio il codice di attivazione per un'arma nucleare ); o che si tratta di un valore che non verrà mai riutilizzato (ad esempio una chiave unica per un accesso bancario) e che l'utente dovrà immettere in modo esplicito ogni volta, invece di poter fare affidamento sul UA per prefillare il valore per lui; o che il documento fornisce il proprio meccanismo di completamento automatico e non desidera che l'interprete fornisca valori di completamento automatico.
0

Ho avuto lo stesso problema in IE 10,11. Sono in grado di risolvere il problema utilizzando il codice qui sotto

var file = $('input[type="file"]'); 
file.removeAttr('value'); 
var cloneFile = file.clone(); 
file.parent().get(0).replaceChild(cloneFile.get(0), file.get(0)); 

Se hai trovato multiplo oggetto per il file quindi utilizzare eq (-2) dopo il selettore come

$('input[type="file"]').eq(-2); 

mi Commento in caso di qualsiasi problema.