upload progress bei einem http file post

Status
Nicht offen für weitere Antworten.
E

eisenhauer

Gast
hallo!

ich habe das problem dass ich über einen http post eine datei hochladen möchte. also:

Code:
  URLConnection conn = new URLConnection(new URL(...));	
  DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
		
(...)

  FileInputStream fis = new FileInputStream(file);
  byte[] bytes = new byte[(int)file.length()];
  fis.read(bytes);
  dos.write(bytes);

(...)
	
  dos.flush ();
  dos.close ();

soweit klappt auch alles wunderbar. jetzt möchte ich aber den fortschritt des datei uploads bekommen. der findet aber erst stattt nachdem der outputstream geschlossen ist. kann ich irgendwie auf diese aktivitäten der urlconnection zugreifen?

bin für jede idee dankbar..

schöne grüße
lukas
 
T

tuxedo

Gast
Werden die Daten erst beim flush() übertragen? Dachte das läuft schon beim dos.write() ...

Im Fall von dos.write() kannst du ja vorher ermitteln wieviel Bytes die gesamte Datei hat. Und in der while-schleife beim füttern des Streams kannst du dann mitzählen wieviel schon geschrieben wurde ...
 
E

eisenhauer

Gast
hi! erstmal danke für die antwort!

also das problem ist dass die daten über den dataoutputstream in den puffer geschrieben werden aus dem sie dann schließlich versendet werden. das heißt wenn ich dos.flush() mache schreibt er die datei zwar komplett in den "ausgangs"-puffer aber an den wirklichen prozess des http posts komm ich nicht ran.

im moment bin ich von der urlconnection ab, weil die wohl in ihren fähigkeiten ziemlich begrenzt zu sein scheint. ich probier es gerade mit dem HttpClient aus dem jakarta commens projekt. über den outputstream der klasse HttpConnection müsste ich doch da irgendwie an informationen kommen wieviel schon geschickt wurde. aber ich weiß leider noch nicht wie ich den richtigen outputstream erwische. also im moment sieht es so aus:

Code:
public void postFile(String name, File file) throws Exception
{		
	PostMethod post = new PostMethod("http://www.os.staybeta.de/lukastest/lukastest.php");
	Part[] parts = {new FilePart("file", file)};
	post.setRequestEntity(new MultipartRequestEntity(parts, post.getParams()));
		
	HttpClient client = new HttpClient();
	HttpConnectionManager manager = client.getHttpConnectionManager();
	HttpConnection conn = manager.getConnection(client.getHostConfiguration());
	FileOutputStream fos = (FileOutputStream)conn.getRequestOutputStream();
	final FileChannel channel = fos.getChannel();
(...)

über den FileChannel will ich dann mit channel.position() an die aktuelle position im stream kommen. leider krieg ich beim compilen immer den fehler:

java.lang.IllegalArgumentException: host parameter is null
at org.apache.commons.httpclient.HttpConnection.<init>(HttpConnection.java:206)
at org.apache.commons.httpclient.HttpConnection.<init>(HttpConnection.java:155)
at org.apache.commons.httpclient.SimpleHttpConnectionManager.getConnectionWithTimeout(SimpleHttpConnectionManager.java:175)
at org.apache.commons.httpclient.SimpleHttpConnectionManager.getConnection(SimpleHttpConnectionManager.java:217)
at org.apache.commons.httpclient.SimpleHttpConnectionManager.getConnection(SimpleHttpConnectionManager.java:129)
at HttpDataPoster.postFile(HttpDataPoster.java:147)
at HttpDataPoster.main(HttpDataPoster.java:235)


hat jemand ne idee wie ich an einen gültigen outputstream kommen kann? oder wie ich das sonst realisieren soll?

bin für jede anregung dankbar!

gruß
lukas
 
B

brdietdidi

Gast
Hi,

ich habe das gleiche Problem und rätsle schon seit ein paar Tagen, wie das wohl zu machen wäre. Ich verwende auch den jakarta.commons.HttpClient.

Was ich mich abere auch frage: Was soll die Progress-Bar eigentlich anzeigen? In diesem Fall doch nicht nur die Übertragungszeit, sondern das Upload als gesamtes. Also auch den Fortschritt des Schreibens auf dem Server. In diesem Fall braucht man aber wahrscheinlich eine Server-Komponenten, die permanent die Fortschritt zurückschickt. Wie fängt man sowas mit einer Post-Methode ab? Das geht doch wohl nicht...

Aber irgendwie muß es ja gehen, da es ja auf dem Markt schon einige Progress-Bars gibt.

Bin auch dankbar für jede Anregung.
 
B

brdietdidi

Gast
Ich habe mein Problem folgend gelöst. Ist vielleicht nicht ganz das, was man sich vorstellt (da das tatsächliche Schreiben auf dem Server dadurch nicht widergespiegelt wird), jedoch ist es mehr als gar nix.

Da ich einen MultiPart-Post anstrebe (weil ich mehrere Files zugleich uploaden will), habe ich die Methode sendData(OutputStream) der Klasse org.apache.commons.httpclient.methods.multipart.FilePart um die Benachrichtigung eines ProgressListeners erweitert:

Code:
protected void sendData(OutputStream out) throws IOException
  {

   [...]

    byte[] tmp = new byte[4096];
    InputStream instream = getSource().createInputStream();
    try
    {
      int len;
      while ((len = instream.read(tmp)) >= 0)
      {
        out.write(tmp, 0, len);




        if (progressListener != null)
          progressListener.bytesWritten((double)len / 1000.00); // weil meine Implementierung des Listeners in KB arbeitet





     }
    }
    finally
    {
      // we're done with the stream, close it
      instream.close();
    }
  }

P.S.: Der ProgressListener ist ein frei erfundenes Interface, das bei der Instantiierung meiner FilePart-Klasse mitgegeben wird.
 

Dante

Bekanntes Mitglied
hi,

das schreiben auf dem server bekommst du eh nicht mit. Warscheinlich sieht java eh nur die ANzahl von Bytes die unten aus der virtuellen Maschine rausfallen und in den TCP-Buffer gehen. Der schickt die dann irgendwann raus und so Gott will, kommen die auch an und so Gott nochmal will, kommt die Bestätigung auch wieder bei uns an.

Dann weiss unser Betriebssystem dass es wieder ein Paket absenden darf, das heisst es ist dann wieder etwas Platz im Buffer, was java auch mitbekommt, wieder etwas reintut und dir das dann auch deutlich macht. Das heisst du bist maximal ungenau um die Größe des TCP-Send-Window und ein paar Buffern auf dem Weg zur Netzwerkkarte. Die sollten aber so riesig nicht sein.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
eskimo328 progress bar mit upload speed Netzwerkprogrammierung 19
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
D CSV File Upload Netzwerkprogrammierung 5
P nanoHttp upload.html page lädt nicht Netzwerkprogrammierung 4
M HTTP File Upload mit Prozessbar Funktioniert nicht. Netzwerkprogrammierung 8
5 File Upload/ ClassNotFoundException Netzwerkprogrammierung 9
B FTPS Upload Netzwerkprogrammierung 3
M Google Image Upload Netzwerkprogrammierung 12
M Apache Solr doc & pdf Upload Netzwerkprogrammierung 8
C apache commons net ftp bei upload unvollständig Netzwerkprogrammierung 3
C HTTP Mediawiki Upload Netzwerkprogrammierung 9
D FTP Pfadangabe für ftp-upload funktioniert nicht Netzwerkprogrammierung 5
R HTTP HttpURLConnection Large File Upload Netzwerkprogrammierung 1
1 Upload problem! org.apache.commons.net.ftp Netzwerkprogrammierung 3
E Applet zum Datei-Upload Netzwerkprogrammierung 3
P Bilder: FTP-Upload funktioniert nicht richtig Netzwerkprogrammierung 2
W HTTP-Upload Netzwerkprogrammierung 2
K Datei-Upload per FTP Netzwerkprogrammierung 2
E Upload großer Dateien? Netzwerkprogrammierung 5
J Java Programm für Upload von Dateien per HTTP Netzwerkprogrammierung 7
L file upload / download über http Netzwerkprogrammierung 5
J File upload mit ftp Netzwerkprogrammierung 4
ModellbahnerTT Download progress Netzwerkprogrammierung 4
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
J client server mit nur einem PC Netzwerkprogrammierung 33
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
E JCIFS - Smb - Datei kann nur von einem Benutzer bearbeitet werden Netzwerkprogrammierung 1
N Name eines Attributes aus einem festen String und einer Variablen generieren Netzwerkprogrammierung 5
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
J Daten von einem HTML-Textfeld abrufen Netzwerkprogrammierung 3
S FTP Verbindung zu einem BS2000 Großrechner mit Commons Net Netzwerkprogrammierung 0
P HTTP Bild von einem Server per http kopieren Netzwerkprogrammierung 1
X Mit Java eine Applikation auf einem anderen Windows Rechner (Windows Server 2008) starten Netzwerkprogrammierung 1
M allgemeine Frage zu einem Web Service Client Netzwerkprogrammierung 2
G Problem mit einem FileWatcher Netzwerkprogrammierung 7
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
E Verbindung zu SQL-Datenbank auf einem Server Netzwerkprogrammierung 13
B Grundlegende Fragen zu einem Verbindungsaufbau in einem LAN Netzwerkprogrammierung 15
Rudolf Socket An welchen Port sendet ein Mailserver zu einem anderen Mailserver Netzwerkprogrammierung 8
S Socket-Frage zu einem LAN-Spiel. Netzwerkprogrammierung 3
F HTTP HTTP-Download: Dateien in einem Verzeichnis ermitteln Netzwerkprogrammierung 8
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
R Threads mit einem WebService Netzwerkprogrammierung 4
N Java NIO eingehende und ausgehende Verbindungen mit einem Selector Netzwerkprogrammierung 12
cedi Socket Mehrere Clients an einem Server Netzwerkprogrammierung 4
C I/O - Synchronisation durch Threads in einem ChatClient Netzwerkprogrammierung 4
D Socket Automatischer Reconnect nach einem Disconnect. Netzwerkprogrammierung 4
H Socket Socket verbindung mit einem TeamSpeak2 Server Netzwerkprogrammierung 5
P Wie gibt man einem GUI Programm ein Web interface? Netzwerkprogrammierung 5
D "FileChooser" auf einem Webserver Netzwerkprogrammierung 5
D Verbindung zu einem Server - POST Netzwerkprogrammierung 2
J Mit Java Anwendung ein (externes) Programm auf einem AIX Rechner starten Netzwerkprogrammierung 6
Schandro Herausfinden ob hinter einem Port bereits ein ServerSocket steckt Netzwerkprogrammierung 2
E Zeit von einem Zeitserver beziehen? Netzwerkprogrammierung 4
H Mit Java ein JPG auf einem Server öffnen. Netzwerkprogrammierung 7
U problem mit verbindung zu einem irc server Netzwerkprogrammierung 3
D Multicast geht nur auf einem Rechner Netzwerkprogrammierung 9
A Java-Programm auf einem Server laufen lassen Netzwerkprogrammierung 9
C Verbindung zum Server prüfen mit einem vorhandenem Socket Netzwerkprogrammierung 4
S RMI server in einem Mehrbenutzer-System mit Auth? Netzwerkprogrammierung 10
D Verbindung über ein Servlet zu einem Server Netzwerkprogrammierung 4
B Im eingelesenen Text nach einem Wort suchen Netzwerkprogrammierung 46
V Einen Eintrag aus einer Zip Datei von einem Server laden Netzwerkprogrammierung 2
G Anzahl verbundener Clients zu einem FTP-Server ermitteln? Netzwerkprogrammierung 4
M Datei auf einem Server ausführen Netzwerkprogrammierung 4
V Kann keine DatagramPackets versenden von einem Jar Archiv Netzwerkprogrammierung 4
N Dateigröße einer Datei auf einem HTTP-/Web-Server. Netzwerkprogrammierung 9
V Zuweisen einer InetAddress mit einem byte Netzwerkprogrammierung 5
J Webserver auf einem Pocket PC Netzwerkprogrammierung 2
S Dateien auf einem HTTP Server Netzwerkprogrammierung 2
B Laden einer *.csv Datei von einem Webserver (http-request) Netzwerkprogrammierung 8
R In Text Datei schreiben die auf einem Server liegt Netzwerkprogrammierung 8
C Login bei einem php-script Netzwerkprogrammierung 2
B HEX String zu einem Byte Array ? *verzweiflung* :( Netzwerkprogrammierung 16
P Probleme mit einem Array aus Sockets Netzwerkprogrammierung 2
O Dateien von einem Server laden Netzwerkprogrammierung 3
T Datei, auf einem Netzwerkrechner speichern. Netzwerkprogrammierung 11
S MySQL, PHP, Perl Support in einem Java HTTP Server? Netzwerkprogrammierung 7

Ähnliche Java Themen

Neue Themen


Oben