#java #download #size
#java #Скачать #размер
Вопрос:
Я хочу определить размер веб-страницы, и поэтому, если он больше некоторого числа (например, 5 МБ), я загружу его или нет. Могу ли я получить эту информацию?
Комментарии:
1. Запросите
HEAD
, а затемGET
.
Ответ №1:
Вы можете сделать приличное приближение с:
HttpURLConnection content = (HttpURLConnection) new URL("www.example.com").openConnection();
System.out.println(content.getContentLength());
Однако это сообщит вам только длину конкретного ресурса, который вы запрашиваете (например, HTML в основании URL-адреса). Вам также нужно просмотреть HTML-код страницы, просмотреть все ресурсы, на которые он ссылается (скрипты с других сайтов, изображения, видео и т.д.) И суммировать их все.
Это приблизит вас к общему размеру, но даже тогда вы не получите идеального подсчета, потому что (а) не все URL-адреса будут возвращать эту информацию, и у вас нет никакого контроля над этим, и (б) в зависимости от того, как загружается контент (например, через AJAX-вызовы, которые скрывают специфику), вы не сможете заранее узнать полный список ресурсов для загрузки.
В качестве альтернативы, если URL-адрес не возвращает результат, я думаю, Джакомо предлагал использовать CounterInputStream. Неплохая идея. Возможно, вы могли бы объединить вышеупомянутое предложение с CounterInputStream, чтобы вести подсчет общего количества отправленных файлов и, возможно, остановить передачу, когда она достигнет указанного максимального общего размера передачи. Таким образом, у вас, по сути, будет прогнозируемый размер (скажем, сайт сообщает вам, что он составит 3,3 МБ), но по мере загрузки вы обнаруживаете, что на самом деле он составляет 6 МБ и еще не остановлен, и принимаете решение больше не загружать.
Комментарии:
1. 1 Хороший момент, вы, вероятно, догадались о первоначальном значении вопроса.
2. В настоящее время мне нужен только размер HTML, поэтому мне не нужно просматривать все ссылки на странице. Спасибо, я попробовал, и это работает.
Ответ №2:
Я могу ошибаться, однако вы не можете просто использовать
HttpURLConnection conn = (HttpURLConnection) new URL("http://www.google.com").openConnection();
System.out.println(conn.getContentLength());
?
Комментарии:
1. Вы не ошибаетесь 🙂 Однако лучше проверить, равна ли ContentLength -1: в этом случае сервер не предоставил никакой информации о длине содержимого.
2. Обычно я бы, однако, просто предоставлял простое решение. 🙂
3. Я дал вам положительный результат, затем я улучшил ваше простое решение. Вот как это работает здесь.
4. Хороший ответ, он такой же, как приведенный ниже, но более полный.