6

Tôi đang cố gắng tải xuống một phần của tệp PDF (chỉ để kiểm tra tiêu đề "Phạm vi"). Tôi yêu cầu máy chủ cho các byte (0-24) trong Phạm vi nhưng vẫn còn, thay vì nhận được 25 byte đầu tiên (một phần) ra khỏi nội dung, tôi nhận được nội dung đầy đủ chiều dài. Hơn nữa, thay vì nhận được mã phản hồi như 206 (nội dung từng phần), tôi nhận được mã phản hồi như 200.Tải xuống một phần của Tệp bằng Yêu cầu HTTP

Dưới đây là mã của tôi:

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

Dưới đây là kết quả:
Respnse Code: 200
Content-Length: 94973848
Downloaded Size: 94973848

Cảm ơn trước.

+0

Bạn có thể xác minh rằng một chương trình mà có thể tải xuống phạm vi không thực sự tải về một phạm vi? (hãy thử bắt đầu wget, Ctrl + C'ing nó và bắt đầu lại) Một số máy chủ có thể từ chối yêu cầu. – hexafraction

Trả lời

-1

Tôi nghĩ tiêu đề chính xác là "Phạm vi nội dung", không phải là "Phạm vi" như bạn đang sử dụng.

+0

gstack, đã thử nó với '" Phạm vi nội dung "' quá; nhận được 'cùng một đầu ra ' –

+1

Nope AFAIK. phạm vi nội dung là những gì máy chủ phản hồi. Phạm vi những gì bạn phải yêu cầu. – Alex

1

Nếu máy chủ hỗ trợ (và máy chủ HTTP 1.1), chỉ khi đó bạn có thể sử dụng yêu cầu dải ô ... và nếu tất cả những gì bạn muốn làm là kiểm tra, thì chỉ cần gửi yêu cầu HEAD thay vì yêu cầu GET. Các tiêu đề giống nhau, giống như mọi thứ, chỉ "HEAD" thay vì "GET". Nếu bạn nhận được phản hồi 206, bạn sẽ biết Phạm vi được hỗ trợ và nếu không bạn sẽ nhận được phản hồi 200.

+0

gstack, tôi đã gửi một yêu cầu '" HEAD "' và nhận mã phản hồi là 200. Điều này phải ngụ ý rằng máy chủ không hỗ trợ tính năng tải xuống '" Tiếp tục lại "'. Sau đó, tôi muốn biết, làm thế nào tôi có thể "tạm dừng" và "tiếp tục" tải xuống tệp này trong các trình quản lý tải xuống khác. Ngoài ra, nó sẽ là tuyệt vời nếu bạn có thể đề xuất bất kỳ liên kết http có nội dung phần có thể được tải về bằng phương pháp này. –

+0

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

8
thay đổi

Hãy thử sau:

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

với:

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

theo spec 14.35.1 Byte Ranges

Tương tự, theo spec 14.5 Accept-Ranges, bạn cũng có thể kiểm tra xem máy chủ của bạn thực sự hỗ trợ thu hồi nội dung một phần hoặc không sử dụng như sau:

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

Bạn cần phải kết nối với URL trước setRequestProperty

Thay đổi:

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

Để:

urlConnection.connect(); 
urlConnection.setRequestProperty("Range", "Bytes=0-24"); 
Các vấn đề liên quan