# URL getContentLength() liefert zu wenig bytes



## Dave81 (29. Mrz 2008)

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:


```
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){};
      }
    }
```


----------



## SlaterB (29. Mrz 2008)

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?


----------



## Dave81 (29. Mrz 2008)

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 (30. Mrz 2008)

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?


----------



## tuxedo (31. Mrz 2008)

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 (31. Mrz 2008)

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 ...


----------



## tuxedo (31. Mrz 2008)

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


----------



## Dave81 (1. Apr 2008)

Danke für eure Hilfe, ich werde mal weiterprobieren und hoffen *g*


----------

