Загрузка части файла с использованием HTTP-запросов

Я пытаюсь загрузить часть файла PDF (только для тестирования заголовка «Диапазон»). Я запросил у сервера байты (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

Заранее спасибо.


person Jeffry Young    schedule 14.07.2013    source источник
comment
Можете ли вы проверить, что программа, которая может загружать диапазоны, действительно загружает диапазон? (попробуйте запустить wget, Ctrl+C и снова запустить его) Некоторые серверы могут отклонить запрос как есть.   -  person nanofarad    schedule 15.07.2013


Ответы (4)


Попробуйте изменить следующее:

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

с:

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

согласно спецификации 14.35.1 Byte Ranges

Точно так же, согласно спецификации 14.5 Accept-Ranges, вы также можете проверить действительно ли ваш сервер поддерживает частичное извлечение контента или не использует следующее:

boolean support = urlConnection.getHeaderField("Accept-Ranges").equals("bytes");
System.out.println("Partial content retrieval support = " + (support ? "Yes" : "No));
person Syed Muhammad Humayun    schedule 14.07.2013
comment
Некоторые серверы, к сожалению, могут правильно ответить 206, но вообще не иметь заголовка Accept-Ranges. - person expert; 05.12.2018

Если сервер поддерживает это (и серверы HTTP 1.1 должны), только тогда вы можете использовать запросы диапазона... и если все, что вы хотите сделать, это проверить, то просто отправьте запрос HEAD вместо запроса GET. Те же заголовки, все то же самое, только "HEAD" вместо "GET". Если вы получите ответ 206, вы будете знать, что диапазон поддерживается, в противном случае вы получите ответ 200.

person Community    schedule 14.07.2013
comment
gstack, я отправил запрос "HEAD" и получил код ответа 200. Это должно означать, что сервер не поддерживает функцию загрузки "Resuming". Тогда я хотел бы знать, как я могу приостановить и возобновить загрузку этого файла в других менеджерах загрузки. Кроме того, было бы здорово, если бы вы могли предложить любые http-ссылки, контент-часть которых может быть загружена этим методом. - person Jeffry Young; 15.07.2013

Вы должны подключиться к URL-адресу до setRequestProperty

Сдача:

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

To:

urlConnection.connect();
urlConnection.setRequestProperty("Range", "Bytes=0-24");
person M.Barati    schedule 22.03.2017

Я думаю, что правильный заголовок - «Content-Range», а не «Range», как вы используете.

person Community    schedule 14.07.2013
comment
gstack, пробовал и с "Content-Range"; получить same output - person Jeffry Young; 15.07.2013
comment
Нет, АФАИК. content-range — это то, что отвечает сервер. Диапазон того, что вы должны запросить. - person Alex; 22.10.2016