2010-06-10 10 views
14

Devo mostrare una barra di avanzamento all'utente che richiede un file da scaricare. Sto usando l'applicazione J2EE per generare il file. L'utente invierà i dati del modulo per ottenere il file. Il server prende tutti i dati inviati manipola, genera e invia un file PDF al client.Visualizzazione di una barra di avanzamento durante il download di un file dal server

Quindi voglio mostrare una barra di avanzamento all'utente finché il file non arriva al lato client. C'è un modo per farlo?

+1

Mi piacerebbe sapere come procedere –

+0

Quanto tempo è necessario per generare il file? – cherouvim

+0

@cherouvim: Il tempo non è statico qui. Varia da file a file. Ci vuole un tempo minimo di 1 secondo a un massimo di 20-30 minuti. –

risposta

9

Se ti capisco bene, vuoi mostrare una barra di avanzamento fino a quando il tuo server è pronto per inviare un file, non per mostrare l'avanzamento del file che sta per essere scaricato.

Se è vero, hai a che fare con un esercizio difficile. Una barra di progressione affidabile deve sapere (abbastanza esattamente) cosa stai facendo e quanto tempo ci vorrà. Nel tuo caso, ci sono molti fattori inaffidabili (uno di questi, forse il più grande, è il web stesso).

Quindi la maggior parte degli sviluppatori utilizza una sorta di animazione "infinita" per visualizzare "lavori in corso".

aggiornamento

Sulla base di un commento, il modo più semplice per visualizzare un "work in progress" di animazione sarà simile

$.ajax({ 
    url:  "/myscripts/myserverscript", 
    type:  "POST", 
    data:  { 
     foo: "bar" 
    }, 
    dataType: "text", 
    beforeSend: function(xhr){ 
     // display a progress animation 
    }, 
    complete: function(xhr, status){ 
     // hide the animation 
    } 
    ... 
}); 

Nel caso di una singola richiesta. È anche possibile impostare un gestore di eventi ajax globale per entrambi (.ajaxStart() e .ajaxStop()) per impostare la funzione Mostra/Nascondi.

Riferimenti: .ajax(), .ajaxStart(), bar .ajaxStop()

+0

Uno dei casi è valido. Sarà bene conoscere l'avanzamento del file scaricato. O sto ancora bene mostrando una barra di lavoro in corso fino a quando il server è pronto per inviare il file. –

+0

Grazie per la risposta. –

+1

+1 per la semplicità di "infinite wait" – cherouvim

3

progresso per la generazione di file lato server:

Partiamo dal presupposto che il server ha bisogno di molti secondi per generare il file. Questo evento è attivato dalla richiesta originale, un'operazione di blocco. Al termine, il file sarà stato generato e verrà inviato nuovamente al client.

Allo stesso tempo, si desidera, tramite altre richieste (ajax), di chiamare il server e ottenere una percentuale indietro per il file che viene attualmente generato per un particolare utente.

parti la colla qui sono:

  • quando la richiesta originale sta generando il file di cui ha bisogno per memorizzare i progressi in intervalli frequenti (cioè ogni 10%). Memorizzando questi dati nella sessione http funzionerà OK.
  • le altre richieste (ajax) devono semplicemente essere in grado di estrarre questa informazione dalla sessione http
  • sincronizzare (accesso di serializzazione) sulla sessione http, cosa che alcune app Web comunemente fanno, è fuori questione, poiché le altre richieste (ajax) si limiterebbero a bloccare fino al completamento della richiesta originale
  • sul lato client è tutto html + javascript per fornire l'interazione necessaria (barra di avanzamento animata). Anche se gli intervalli sono molto difficili (passando dal 10% al 20% al 30%) puoi animare la barra con jQuery. L'ho fatto una volta in passato e sembra fantastico.

barra di avanzamento per il download di file:

è meglio lasciare questo alla finestra di dialogo nativa del browser.

+0

Posso sapere come ottieni le informazioni sul download del file da html/java-script? Puoi condividere qualche altra informazione sull'ultimo punto che hai detto (sul lato client è tutto ....)? –

+0

Sul lato server è necessario un URL (ad esempio un servlet Java) che fornisca queste informazioni (è sufficiente stampare la percentuale dalla sessione http). Se questo sarà testo normale (ad esempio "20%") o JSON o XML dipende da te e da come implementerai il lato client. Sul lato client si faranno richieste asincrone sull'URL via jQuery per ottenere queste informazioni e modificare di conseguenza il DOM. Le richieste dovranno essere attivate ogni X secondi (diciamo 3 secondi) tramite la funzione javascript setTimeout (..) – cherouvim

+0

Per questo tipo di approccio, suggerirei davvero una sorta di modo COMET, non di richieste Ajax native. – jAndy

0

In Java è sufficiente racchiudere un javax.swing.ProgressMonitorInputStream attorno al flusso di input, ma si tenga presente che, a meno che il server non invii una modalità di streaming chunked, il display non significherà nulla, poiché l'intera risposta sarà stata letta in memoria prima che il primo byte venga consegnato a Java.

Problemi correlati