2014-03-25 19 views
5

Ich implementiert eine WebRequest-Klasse für meine grundlegenden GET und POST-Anforderungen an URLConnections.Java HttpUrlConnection Status der tatsächlich gesendeten Bytes

Eines der Merkmale von Dateien einreichen - Nun möchte Ich mag den Fortschritt der Upload-Datei zu berechnen und anzuzeigen - aber ich weiß nicht, wie das zu tun:

for (KeyFilePair p : files) { 
     if (p.file != null && p.file.exists()) { 
      output.writeBytes("--" + boundary + "\n"); 
      output.writeBytes("Content-Disposition: form-data; name=\"" 
        + p.key + "\"; filename=\"" + p.file.getName() + "\"\n"); 
      output.writeBytes("Content-Type: " + p.mimetype 
        + "; charset=UTF-8\n"); 
      output.writeBytes("\n"); 

      InputStream is = null; 
      try { 
       long max = p.file.length(); 
       long cur = 0; 
       is = new FileInputStream(p.file); 
       int read = 0; 
       byte buff[] = new byte[1024]; 
       while ((read = is.read(buff, 0, buff.length)) > 0) { 
        output.write(buff, 0, read); 
        output.flush(); 
        cur += read; 
        if (monitor != null) { 
         monitor.updateProgress(cur, max); 
        } 
       } 
      } catch (Exception ex) { 
       throw ex; 
      } finally { 
       if (is != null) { 
        try { 
         is.close(); 
        } catch (Exception ex) { 
         ex.printStackTrace(); 
        } 
       } 
      } 
     } 
    } 
    output.writeBytes("\n--" + boundary + "--\n"); 

In diesem Code, den Sie Siehe die grundlegende Berechnung der geschriebenen Bytes für den OutputStream-Ausgang. Da aber die Anfrage nicht vor dem Öffnen des InputStream meiner Verbindung (oder Lesen des Statuscodes) an den Server gesendet wird, ist diese Bytezählung völlig nutzlos und zeigt nur den Fortschritt der Anfragevorbereitung an.

Also meine Frage ist: Wie kann ich den aktuellen Status der tatsächlich gesendeten Bytes auf den Server überwachen? Ich habe bereits die Java-Quellen von getInputStream der entsprechenden Klassen (HttpUrConnection) überprüft, um zu versuchen zu verstehen, wie und wann tatsächlich Bytes auf den Server geschrieben werden ... aber ohne Schlussfolgerung.

Gibt es eine Möglichkeit, das zu tun, ohne meine eigene Implementierung des HTTP-Protokolls zu schreiben?

Dank

Mit freundlichen Grüßen matt

Antwort

6

Sie haben conn.setChunkedStreamingMode(-1); // use default chunk size einzustellen.

Falls nicht, puffert HUC die gesamten Daten, nur um zu wissen, welcher Wert Content-Length ist. Sie überwachen den Pufferungsprozess tatsächlich.

Als Alternative könnten Sie die Größe Ihres mehrteiligen Körpers (viel Glück!) Berechnen und conn.setFixedLengthStreamingMode(lengthInBytes) anrufen.

Sie finden mehr auf HttpUrlConnection multipart file upload with progressBar

+0

vielen Dank - es funktioniert :) – matt