URL getContentLength() liefert zu wenig bytes

Status
Nicht offen für weitere Antworten.
D

Dave81

Gast
Hallo Leute!
Ich bin mit meinem Latein am ende.
Ich versuche eine Datei die so um die 100MB hat über eine URLConnection zu laden und auf die Festplatte zu speichern.

Der Aufruf von con.getContentLength() liefert aber nur 2331 bytes. Wie schaffe ich es die ganze Datei zu laden.

Hier der SourceCode:

Code:
   java.io.BufferedInputStream is = null;
   java.io.FileOutputStream fos = null;
   try{
      java.net.URL download = new java.net.URL("http://www.myserver.com/myFile.rar");

      java.net.HttpURLConnection con = (java.net.HttpURLConnection) download.openConnection();

      //Habe es auch schon ohne setRequestMethod versucht
      con.setRequestMethod("GET");
      con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; JVM)");
      con.setRequestProperty("Pragma", "no-cache");
      con.setRequestProperty("Connection", "keep-alive");


      System.out.println(con.getHeaderField("content-type")); //liefert nur 2331 bytes
      //int length = con.getHeaderFieldInt("content-length", -1);

      System.out.println(con.getContentType()); //liefert auch nur 2331 bytes
      int length = con.getContentLength();

      is = new java.io.BufferedInputStream(download.openStream());
      fos = new java.io.FileOutputStream(System.getProperty("user.dir")+java.io.File.separator+"out.rar", false);

      //System.out.println(is.available()); //liefert auch nur 2331 bytes

      byte[] buf = new byte[1024];
      int len = 0;
      // die nachfolgende Schleife liefert eben auch nur 2331 bytes
      while( (len = is.read(buf)) > 0 ){
        for(int i = 0; i < len; i++){
          fos.write(buf[i]);
        }
      }
    }catch(Exception e){

    }finally{
      if(is != null && fos != null){
        try{
          fos.flush();
          fos.close();
          is.close();
        }catch(Exception e){};
      }
    }
 
S

SlaterB

Gast
vielleicht wird eben nicht die von dir erwartete Datei gesendet sondern irgendeiner HTML-Antwort wie 'nicht gefunden/ keine Erlaubnis'?
schon mal in diese 2331 Bytes reingeschaut?
 
D

Dave81

Gast
Es werden eben nur die ersten 2331 byte gesendet.
Bei kleineren Dateien (unter 1KB) funktioniert es wunderbar. Da hab ich eine vollständige Übertragung erreicht.
Aber bei größeren Dateien werden nicht alle Daten geliefert.
 

HoaX

Top Contributor
dann solltest du ehr das problem beim server suchen?! gibt es internetseiten wo der fehler auch auftritt so dass wir das selbst probieren können?
 
T

tuxedo

Gast
In deiner While-Schleife solltest du auf ">= 0" und nicht nur auf "> 0" prüfen. Grund: Erst bei -1 ist der Stream zuende. Zwischendrin kann/darf es auf vorkommen dass read 0 zurückliefert weil dein Rechner z.B. schneller empfangen will als der Server gerade sendet. Denke das könnte (muss aber nicht zwangsläufig) dein Problem beheben.

- Alex
 

HoaX

Top Contributor
da auch getContentLengh schon zuwenig liefert tippe ich mal dass das >0 nicht das problem ist. wobei != -1 nochmal besser ist als >=0, aber das hatten wir ja schonmal in nem anderen thread ... ;)
 
T

tuxedo

Gast
Auch wieder wahr. Wobei ja schonmal gesagt wurde, dass getContentLengh nicht immer zuverlässig ist (stand irgendwo kürzlich in nem anderen Thread).

Man sollte eben wirklich mal schauen was in diesen 2331 Bytes wirklich drin steht.

Muss mir selbst das mit dem != -1 angewöhnen ... *hinter die ohren schreib*

- Alex
 
D

Dave81

Gast
Danke für eure Hilfe, ich werde mal weiterprobieren und hoffen *g*
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben