Загрузка части файла с использованием HTTP-запросов
Я пытаюсь загрузить часть файла PDF (только для проверки заголовка "Range"). Я запросил у сервера байты (0-24) в диапазоне, но все же вместо того, чтобы получить первые 25 байтов (часть) из контента, я получаю контент полной длины. Более того, вместо получения кода ответа как 206 (частичное содержимое) я получаю код ответа как 200.
Вот мой код:
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();
}
}
Вот вывод:
Respnse Code: 200
Content-Length: 94973848
Downloaded Size: 94973848
Заранее спасибо.
4 ответа
Попробуйте изменить следующее:
urlConnection.setRequestProperty("Range", "Bytes=0-24");
с:
urlConnection.setRequestProperty("Range", "bytes=0-24");
согласно спецификации 14.35.1 Байт
Точно так же, согласно спецификации 14.5 Accept-Ranges, вы также можете проверить, поддерживает ли ваш сервер на самом деле частичное извлечение контента или не использует следующее:
boolean support = urlConnection.getHeaderField("Accept-Ranges").equals("bytes");
System.out.println("Partial content retrieval support = " + (support ? "Yes" : "No));
Если сервер поддерживает это (и серверы HTTP 1.1 должны), только тогда вы можете использовать запросы диапазона... и если все, что вы хотите сделать, это проверить, то просто отправьте запрос HEAD вместо запроса GET. Те же заголовки, все то же самое, просто "ГОЛОВА" вместо "ПОЛУЧИТЬ". Если вы получите ответ 206, вы будете знать, что Range поддерживается, а в противном случае вы получите ответ 200.
Вы должны подключиться к URL до setRequestProperty
Изменить:
urlConnection.setRequestProperty("Range", "Bytes=0-24");
urlConnection.connect();
Для того, чтобы:
urlConnection.connect();
urlConnection.setRequestProperty("Range", "Bytes=0-24");
Я думаю, что правильный заголовок "Content-Range", а не "Range", как вы используете.