OkHttpClient ответ 206 исключение - PullRequest
0 голосов
/ 27 ноября 2018

Я использую OkHttpClient для приложения Android для загрузки файлов PDF с сервера, я получил исключение для файла PDF при загрузке.

System.err: java.io.IOException: 206

вот элементы ответа:

Date: Tue, 27 Nov 2018 12:45:17 GMT
Server: Apache/2.4.23 (Win64) PHP/5.6.25
Last-Modified: Mon, 09 Jan 2017 16:06:27 GMT
ETag: "392a0c-545ab8ccd2dc8"
Accept-Ranges: bytes
Content-Length: 1
Content-Range: bytes 3746315-3746315/3746316
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/pdf
OkHttp-Sent-Millis: 1543322716318
OkHttp-Received-Millis: 1543322716467

и это код, используемый для закрытия файла:

private final static int BUFFER_SIZE = 1024 * 8;
Request.Builder requestBuilder = new Request.Builder().url(itemUrl);

try {
        Response response = 
        getOkHttpClient().newCall(requestBuilder.build()).execute();

        long totalSize = response.body().contentLength();

        if (response.code() != 200) {
            throw new IOException(String.valueOf(response.code()));
        }

        RandomAccessFile out = new RandomAccessFile(tempItemFilePath, "rw");

        byte[] buffer = new byte[BUFFER_SIZE];

        BufferedInputStream in = new BufferedInputStream(response.body().byteStream(), BUFFER_SIZE);

        long bytesCount = 0;
        int bytesRead = 0;

        try {

            out.seek(out.length());

            while (true) {
                bytesRead = in.read(buffer, 0, BUFFER_SIZE);
                if (bytesRead == -1) {
                    break;
                }
                out.write(buffer, 0, bytesRead);
                manager.setDownloadStatus(magazine, ((bytesCount * 100) / totalSize));
                bytesCount += bytesRead;



                EventBus.getDefault().post(new DownloadStatusUpdateEvent());
            }
        } finally {
            out.close();
            if (in != null) {
                in.close();
            }
            in.close();
        }
        }

Есть идеи, почему он не работает?PS: он работает для файлов меньше, чем тот, который он не загружает.

1 Ответ

0 голосов
/ 30 ноября 2018

Проблема в том, что вы выполняете запрос диапазона , запрашивающий последний байт из 3746316 байтов, составляющих ответ.

В ответ на это вы получаете код состояния 206в соответствии с RFC 7233:

Код состояния 206 (частичное содержимое) указывает, что сервер успешно выполняет запрос диапазона для целевого ресурса, передав одну или несколько частей выбранного представления, которые соответствуютвыполнимые диапазоны находятся в поле заголовка Range запроса (раздел 3.1).

Причиной, по которой вы получаете это исключение, является фрагмент кода:

if (response.code() != 200) {
    throw new IOException(String.valueOf(response.code()));
}

Что вы должны проверитьвместо этого, если ответ успешен (т.е. если он имеет статус 2xx), что можно сделать следующим образом:

if (!response.isSuccessful()) {
    throw new IOException(...);
}

Обратите внимание, что ваш код успешно создаст RandomAccessFile с содержимымответ, т. е. один байт в данном случае, который, вероятно, не предназначен.

...