2010-06-10 15 views
14

Ich muss dem Benutzer, der eine Datei zum Herunterladen anfordert, eine Fortschrittsleiste anzeigen. Ich verwende J2EE-Anwendung, um die Datei zu generieren. Der Benutzer sendet die Formulardaten, um die Datei zu erhalten. Der Server nimmt alle übergebenen Daten auf, manipuliert, generiert und sendet eine PDF-Datei zurück zum Client.Beim Laden einer Datei vom Server wird eine Fortschrittsanzeige angezeigt

Also ich möchte einen Fortschrittsbalken für den Benutzer zeigen, bis die Datei auf die Client-Seite kommt. Gibt es eine Möglichkeit, dies zu tun?

+1

Ich würde gerne wissen, wie man das macht –

+0

Wie lange dauert es normalerweise, um die Datei zu generieren? – cherouvim

+0

@cherouvim: Die Zeit ist hier nicht statisch. Es variiert zwischen Datei zu Datei. Es dauert mindestens 1 Sekunde bis maximal 20-30 Minuten. –

Antwort

9

Wenn ich Sie gut verstehe, möchten Sie einen Fortschrittsbalken anzeigen, bis Ihr Server bereit ist, eine Datei zu senden, um den Fortschritt der heruntergeladenen Datei nicht anzuzeigen.

Wenn das stimmt, haben Sie es mit einer harten Übung zu tun. Eine zuverlässige Fortschrittsbalken muss wissen (ziemlich genau), was Sie tun und wie lange es dauern wird. In Ihrem Fall gibt es viele unzuverlässige Faktoren (einer von ihnen, vielleicht der größte, ist das Web selbst).

So verwenden die meisten Entwickler eine Art "endlose" Animation, um "work in progress" anzuzeigen.

Update

Basierend auf Ihren Kommentar, der einfachste Weg, ein "work in progress" Animation Im Falle einer einzigen Anfrage

$.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 
    } 
    ... 
}); 

würde anzuzeigen aussehen. Sie können auch einen globalen Ajax-Event-Handler für beide einrichten (.ajaxStart() und .ajaxStop()), um die show/hide-Funktionalität einzurichten.

Referenzen: .ajax(), .ajaxStart(), .ajaxStop()

+0

Einer der Fälle ist gültig. Es ist gut, den Fortschritt der heruntergeladenen Datei zu kennen. Oder ich bin immer noch in Ordnung mit einem Balken in Arbeit, bis der Server bereit ist, die Datei zu senden. –

+0

Danke für Ihre Antwort. –

+1

+1 für die Einfachheit von "unendlich warten" – cherouvim

3

Fortschrittsbalken für die Datei Generation Server-Seite:

Wir gehen davon aus, dass der Server viele Sekunden zu erzeugen, um die Datei benötigt. Dieses Ereignis wird von der ursprünglichen Anforderung, einer Blockierungsoperation, ausgelöst. Wenn dies abgeschlossen ist, wurde die Datei generiert und an den Client zurückgesendet.

Gleichzeitig möchten Sie, über andere Anfragen (Ajax), den Server aufrufen und erhalten einen Prozentsatz zurück für die Datei, die gerade für den bestimmten Benutzer generiert wird.

Die Klebeteile sind hier:

  • wenn die ursprüngliche Anforderung die Datei generiert braucht es die Fortschritte in regelmäßigen Abständen zu speichern (das heißt alle 10%). Speichern dieser Daten in der http-Sitzung funktioniert OK.
  • die anderen Anforderungen (ajax) müssen einfach in der Lage sein, diese Informationen aus der HTTP-Sitzung
  • Synchronisierung (Serialisierung zugreifen) auf der http-Sitzung, etwas, dass einige Web-Anwendungen häufig tun, kommt nicht in Frage, da die anderen Anfragen (Ajax) einfach blockieren würden, bis die ursprüngliche Anfrage
  • auf der Client-Seite ist es alles HTML + Javascript, um die Interaktion, die Sie benötigen (animierte Fortschrittsbalken) zu beenden. Auch wenn die Intervalle sehr grob sind (Sprung von 10% auf 20% auf 30%), können Sie die Leiste mit jQuery animieren. Ich habe es einmal in der Vergangenheit getan und es sieht gut aus.

Fortschrittsbalken für Datei herunterladen:

es am besten, diese nativen Dialogfelds an den Browser zu verlassen.

+0

Kann ich wissen, wie Sie die Datei Download-Informationen aus dem HTML/Java-Skript erhalten? Kannst du etwas mehr über den letzten Punkt sagen, was du gesagt hast (auf der Client-Seite ist alles ....)? –

+0

Auf der Serverseite benötigen Sie eine URL (z. B. ein Java-Servlet), die diese Informationen bereitstellt (einfach den Prozentsatz aus der http-Sitzung drucken). Ob dies reiner Text (z. B. "20%") oder JSON oder XML ist, hängt von Ihnen ab und wie Sie die Client-Seite implementieren. Auf der Client-Seite werden Sie über jQuery asynchrone Anforderungen an die URL stellen, um diese Informationen zu erhalten und das DOM entsprechend zu modifizieren. Die Anfragen müssen alle X Sekunden (sagen wir 3 Sekunden) über die JavaScript-Funktion setTimeout (..) ausgelöst werden. – cherouvim

+0

Für diese Art von Ansatz würde ich wirklich eine Art COMET-Weg vorschlagen, nicht native Ajax-Anfragen. – jAndy

0

In Java wickeln Sie einfach einen javax.swing.ProgressMonitorInputStream um den Eingabestream, aber beachten Sie, dass, wenn der Server im Chunked Streaming-Modus sendet, die Anzeige nichts wirklich bedeutet, da die gesamte Antwort gelesen wurde in den Speicher, bevor das erste Byte an Java übergeben wird.

Verwandte Themen