6

Próbuję pobrać część pliku PDF (tylko do testowania nagłówka "Zakres"). Poprosiłem serwer o bajty (0-24) w zakresie, ale nadal, zamiast otrzymywać pierwsze 25 bajtów (część) z treści, otrzymuję pełną treść. Co więcej, zamiast się kod odpowiedzi jako 206 (częściowe Content), dostaję kodu odpowiedzi jako 200.Pobieranie części pliku za pomocą żądań HTTP

Oto mój kod:

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(); 
    } 
} 

Oto wynik:
Respnse Code: 200
Content-Length: 94973848
Downloaded Size: 94973848

Dzięki z góry.

+0

można sprawdzić, czy program, który można pobrać zakresy rzeczywiście pobrać zasięg? (spróbuj uruchomić wget, Ctrl + C'ing i ponownie go uruchomić) Niektóre serwery mogą odrzucić żądanie tak jak jest. – hexafraction

Odpowiedz

-1

Uważam, że prawidłowym nagłówkiem jest "Zakres zawartości", a nie "Zakres" w trakcie używania.

+0

gstack, wypróbowany z '" Content-Range "' too; uzyskanie "tego samego wyjścia" –

+1

Nope AFAIK. content-range jest odpowiedzią serwera. Zakres, o który musisz poprosić. – Alex

1

Jeśli serwer go obsługuje (a serwer HTTP 1.1 powinien), wówczas można użyć żądań zakresu ... i jeśli wszystko, co chcesz zrobić, to sprawdzić, a następnie po prostu wysłać żądanie HEAD zamiast żądania GET. Same nagłówki, to samo wszystko, po prostu "HEAD" zamiast "GET". Jeśli otrzymasz odpowiedź 206, będziesz wiedział, że zakres jest obsługiwany, a w przeciwnym razie otrzymasz odpowiedź 200.

+0

gstack, wysłałem żądanie '" HEAD "' i otrzymałem kod odpowiedzi jako 200. To musi sugerować, że serwer nie obsługuje '' Wznawianie ''funkcji pobierania. Następnie chciałbym wiedzieć, w jaki sposób mogę "wstrzymać" i "wznowić" pobieranie tego pliku w innych menedżerach pobierania. Byłoby również wspaniale, gdybyś zaproponował linki http, których treść można pobrać tą metodą. –

+0

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

8

Spróbuj zmienić następujące:

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

z:

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

jak na spec 14.35.1 Byte Ranges

Podobnie jak na spec 14.5 Accept-Ranges, można również sprawdzić, czy Twój serwer faktycznie podpory częściowe pobieranie treści lub nieużywanie:

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

Musisz podłączyć do adresu przed setRequestProperty

Zmiana:

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

Do:

urlConnection.connect(); 
urlConnection.setRequestProperty("Range", "Bytes=0-24"); 
Powiązane problemy