Как стать автором
Обновить

Комментарии 12

Ещё можно вспомнить про хедеры If-Match и If-Unmodified-Since которые позволят отловить ситуацию когда файл изменён в процессе скачивания.

На подобный запрос сервер в ответ пришлёт два возможных статуса

Три, не считая ошибочных. Еще вы можете получить 200 OK и весь файл целиком — потому что вы забыли про то, что сервер совершенно не обязан вообще поддерживать Range. В ответе на HEAD надо проверить наличие Accept-Ranges, и что там написано (а то если там none, вам тоже ничего не светит).

А еще на большинство ошибочных статусов просто нельзя делать повторную попытку — потому что в случае авторизации повторная попытка ничего не исправит, а в случае таймаута — тупо тормознет процесс еще на одну величину таймаута.

В общем, авторские примеры кода — барахло полное.

>Дополним метод еще логами
А еще err.println — это не логирование.
На 5хх коды стабильно шлю повтор и в большинстве (больше 80%) случаев получаю корректный ответ.
Таймауты тоже решаются стабильно, ибо если это не мертвый сервер, он может в какой то момент всё таки ответить успеть.
Впрочем, про код ничего говорить не буду, я пишу на шарпе.
Я ведь не исключаю получение ответа при повторе, заметьте. Я лишь говорю, что перед повтором нужно смотреть на статус/ошибку. Потому что повторять неисправимые ошибки бессмысленно чуть более чем полностью.
Знаете что ответят Вам PHP программисты?
<?php
readfile('filename');
?>

В итоге для отдачи обычного бинарника грузится интерпретатор, берёт файл, пропускает через себя и отдает клиенту.

Расширенные заголовки при этом игнорируются. К сожалению, такая практика встречается довольно часто.
<?php
$file = file_get_contents('URL');
<?

Но Вы же понимаете что такое уровни абстракции. Зачем программистам на PHP делать все это, что описано в статье? Это все должно быть в низкоуровневой библиотеке для PHP, в которой можно вызывать ее и все.
Программистам на Java всё это каждый раз тоже делать не нужно, и это тоже будет в библиотеке.

А для file_get_contents в Java всегда можно и вот так сделать:
byte[] content  = new URL("...").openStream().readAllBytes();

или так

try (var output = new FileOutputStream("output_file")) {
    new URL("...").openStream().transferTo(output);
}

Как и ваши варианты, грузить будет как придётся, без контроля с вашей стороны.

жаль что не рассмотрели вариант с перемоткой видео с поддержкой atom

А какие там особенности и что за atom?

Есть ли на уровне протокола аналогичный подход для upload'а файла?

К сожалению нет. Но некоторые делают через PATCH и кастомные заголовки.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации