PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mit Java per http Datei hochladen mit Progress



yankee42
13-09-2006, 03:44
Hi @ll,

ich verzweifele gerade daran von meinem java-Programm eine Datei an php zu übergeben...
Da der Upload recht lange dauern kann, würde ich gerne einen Fortschrittsbalken einbauen, aber wie?

Ich verwende zum Upload momentan diesen Code:
http://forum.java.sun.com/thread.jspa?forumID=31&threadID=451245

Das Problem ist, dass die Daten erst wirklich versendet werden, wenn ich den inputstream öffne:
BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));

Durch google habe ich erfahren, dass das bei http nunmal so ist, dass die Daten erst gesendet werden können, wenn man eine Verbindung zum lesen aufmacht. Allerdings kann ich die Leseverbindung auch nicht aufmachen, bevor ich mir dem http-request fertig bin :-(.
Wie kann ich dann noch an den Übertragungsfortschritt kommen...?

falke2203
13-09-2006, 06:45
Auf die Schnelle könnte ich dir ein Workaround vorschlagen. Wenn du die Methode public void writeFile(String name, String mimeType, String fileName, InputStream is) aus MultipartFormOutpuStream (http://forum.java.sun.com/thread.jspa?forumID=31&threadID=451245) verwendest, kannst du einen ProgressMonitorInputStream (http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/ProgressMonitorInputStream.html) einhängen. Das sollte dein Problem lösen, da die Daten in o.g. Methode immer in 1kB-Blöcken gelesen und dann rausgeschrieben werden. Mit dieser Lösung hättest du also bei deiner Fortschrittsanzeige eine Abweichung um die Zeit, die zum Übertragen von 1kB (+ vielleicht etwas Footprint) benötigt wird.

yankee42
15-09-2006, 10:19
Soweit ich das sehe hilft mir das nicht weiter...
Damit könnte ich zwar auslesen, wieviel von der Datei die verschickt werden soll bis jetzt gelesen wurde und in den outputstream out geschrieben wurde...
Aber das geht ja eh so schnell, dass man es garicht mitbekäme.
Denn alles, was ich in out schreibe wird zunächst mal nur irgendwo gebuffert und erst abgeschickt, wenn ich den inputstream öffne...

Oder habe ich dich falsch verstanden...?

falke2203
17-09-2006, 19:08
So wie ich das hier:


while((r = is.read(data, 0, data.length)) != -1) {
out.write(data, 0, r);
}

interpretiere, werden immer 1 KB große Blöcke der Datei gelesen und direkt in den OutputStream geschrieben. Eine gewisse Varianz könnte sich natürlich durch die Größe des OutputStream-Puffers ergeben, die dürfte aber überschaubar sein und, gerade bei großen Dateien, nicht sonderlich ins Gewicht fallen.

Am einfachsten probierst du es einfach mal aus, indem du den Ausdruck


... = new FileInputStream(...);

in deinem Code (der Parameter für die write-Methode in MultipartFormOutputStream) durch


... = new ProgressMonitorInputStream(new FileInputStream(...));

ersetzt.