Проверка типа контента по URL

1

Я задал этот вопрос раньше, и Евгений Дорофеев ответил на него. Хотя работал только на прямую связь, но я принял его ответ. Он просто рассказал мне о проверке типа контента из прямой ссылки:

String requestUrl = "https://dl-ssl.google.com/android/repository/android-14_r04.zip";
URL url = new URL(requestUrl);
URLConnection c = url.openConnection();
String contentType = c.getContentType();

Насколько я знаю, для загрузки файла существует два типа URL:

  • Прямая ссылка. Например: https://dl-ssl.google.com/android/repository/android-14_r04.zip. Из этой ссылки мы можем напрямую загрузить данные и получить имя файла, включенное в расширение файла (в этой ссылке, расширение .zip). Поэтому мы можем знать, какой файл нужно загрузить. Вы можете попробовать скачать по этой ссылке.
  • Непрямая ссылка. Например: http://www.example.com/directory/download?file=52378. Вы когда-нибудь пытались загрузить данные с Google Диска? При загрузке данных с Google Диска он предоставит вам непрямую ссылку, такую как ссылка выше. Мы никогда не знаем, содержит ли ссылка файл или веб-страницу. Кроме того, мы не знаем, имя файла и расширение файла, потому что этот тип ссылки нечеткий и случайный.

Мне нужно проверить, является ли это файлом или веб-страницей. Я должен загрузить его, если тип содержимого - это файл.

Поэтому мой вопрос:

  • Как проверить тип контента из непрямой ссылки?
  • Как показано в комментариях к этому вопросу, могут ли HTTP-перенаправления решить проблему?

Спасибо за вашу помощь.

  • 1
    возможное решение: обработка перенаправлений HttpClient
  • 0
    Что вы имеете в виду под непрямой ссылкой? HTTP-редиректы?
Показать ещё 4 комментария
Теги:
url
httpurlconnection
content-type

3 ответа

5
Лучший ответ

После открытия URLConnection возвращается файл заголовка. В нем есть информация о файле. Вы можете тянуть то, что вы хотите оттуда. Например:

URLConnection u = url.openConnection();
long length = Long.parseLong(u.getHeaderField("Content-Length"));
String type = u.getHeaderField("Content-Type");

length - размер файла в байтах, type - это что-то вроде application/x-dosexec или application/x-rar.

  • 0
    Из класса URLConnection метод getHeaderField() возвращает поле заголовка Content-Type . Этот метод возвращает то же поле заголовка с getContentType() . Извините, я не могу принять этот ответ.
  • 0
    Так? Я не знаю, в чем проблема, потому что они оба работают хорошо. С какими проблемами вы столкнулись?
Показать ещё 1 комментарий
1

Такие ссылки перенаправляют браузеры на фактический контент с помощью перенаправления HTTP. Чтобы получить правильный тип контента, все, что вам нужно сделать, - это указать HttpURLConnection чтобы следовать переадресации, установив setFollowRedirects() в true (документально здесь).

0

MimeTypeMap.getFileExtensionFromUrl(URL)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню