В Java возможно определить размер веб-страницы перед загрузкой?

#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. Хороший ответ, он такой же, как приведенный ниже, но более полный.