6

Ich versuche, einen Teil einer PDF-Datei herunterzuladen (nur zum Testen der "Range" -Kopfzeile). Ich habe den Server nach den Bytes (0-24) in Range gefragt, aber immer noch, anstatt die ersten 25 Bytes (einen Teil) aus dem Inhalt zu bekommen, bekomme ich den Inhalt voller Länge. Darüber hinaus kann anstelle der Antwortcode als 206 (Teilinhalt) bekommen, erhalte ich Antwortcode als 200Herunterladen eines Teils einer Datei mit HTTP-Anfragen

Hier mein Code ist:

public static void main(String a[]) { 
    try { 
     URL url = new URL("http://download.oracle.com/otn-pub/java/jdk/7u21-b11/jdk-7u21-windows-x64.exe?AuthParam=1372502269_599691fc0025a1f2da7723b644f44ece"); 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
     urlConnection.setRequestProperty("Range", "Bytes=0-24"); 
     urlConnection.connect(); 

     System.out.println("Respnse Code: " + urlConnection.getResponseCode()); 
     System.out.println("Content-Length: " + urlConnection.getContentLengthLong()); 

     InputStream inputStream = urlConnection.getInputStream(); 
     long size = 0; 

     while(inputStream.read() != -1) 
      size++; 

     System.out.println("Downloaded Size: " + size); 

    }catch(MalformedURLException mue) { 
     mue.printStackTrace(); 
    }catch(IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

Hier ist die Ausgabe:
Respnse Code: 200
Content-Length: 94973848
Downloaded Size: 94973848

Dank im Voraus.

+0

Können Sie überprüfen, ob ein Programm, das im Bereich herunterladen können in der Tat ein downloadet Angebot? (Versuchen Sie, wget zu starten, Strg + C'ing, und starten Sie es erneut) Manche Server lehnen die Anfrage möglicherweise so ab, wie sie ist. – hexafraction

Antwort

-1

Ich denke, die richtige Überschrift ist "Content-Range", nicht "Range", wie Sie verwenden.

+0

gstack, probierte es mit '" Content-Range "' too; den gleichen Ausgang bekommen –

+1

Nein AFAIK. Inhaltsbereich ist, was der Server beantwortet. Bereich, was Sie anfordern müssen. – Alex

1

Wenn der Server es unterstützt (und HTTP 1.1 Server sollten), nur dann können Sie Bereichsanfragen ... und wenn alles, was Sie tun möchten, zu überprüfen, dann senden Sie eine HEAD-Anfrage anstelle einer GET-Anfrage. Gleiche Header, alles gleich, nur "HEAD" statt "GET". Wenn Sie eine Antwort von 206 erhalten, wissen Sie, dass Range unterstützt wird, andernfalls erhalten Sie eine Antwort von 200.

+0

gstack, ich habe eine '' HEAD''-Anfrage gesendet und den Antwortcode als 200 erhalten. Dies muss andeuten, dass der Server das ''Resuming'' -Downloads-Feature nicht unterstützt. Dann würde ich gerne wissen, wie ich den Download dieser Datei in anderen Download-Managern "pausieren" und "fortsetzen" kann. Es wäre auch großartig, wenn Sie irgendwelche http-Links vorschlagen könnten, deren Inhaltsteil mit dieser Methode heruntergeladen werden kann. –

+0

http://marvinlee.wordpress.com/2007/08/08/make-your-own-java-download-manager/ –

8

Versuchen Sie, folgende:

urlConnection.setRequestProperty("Range", "Bytes=0-24"); 

mit:

urlConnection.setRequestProperty("Range", "bytes=0-24"); 

gemäß der Spezifikation 14.35.1 Byte Ranges

ähnlich gemäß der Spezifikation 14.5 Accept-Ranges, können Sie auch Ihr Server tatsächlich unterstützt prüfen, ob teilweise Inhalt abrufen oder nicht verwenden:

boolean support = urlConnection.getHeaderField("Accept-Ranges").equals("bytes"); 
System.out.println("Partial content retrieval support = " + (support ? "Yes" : "No)); 
-1

Sie haben eine Verbindung url vor setRequestProperty

Wechsel:

urlConnection.setRequestProperty("Range", "Bytes=0-24"); 
urlConnection.connect(); 

An:

urlConnection.connect(); 
urlConnection.setRequestProperty("Range", "Bytes=0-24"); 
Verwandte Themen