Ответ 1
Если "другой" конец поддерживает его, вы можете использовать метод HEAD
HTTP?
Мне нужно записать тип контента (если это изображение, аудио или видео) URL-адреса, который был вставлен пользователем. У меня есть такой код:
URL url = new URL(urlname);
URLConnection connection = url.openConnection();
connection.connect();
String contentType = connection.getContentType();
Я получаю тип содержимого, но проблема в том, что кажется, что необходимо загрузить весь файл, чтобы проверить его тип содержимого. Так что это длится слишком много времени, когда файл довольно большой. Мне нужно использовать его в приложении Google App Engine, поэтому запросы ограничены 30 секундами.
Есть ли другой способ получить тип содержимого URL-адреса без загрузки файла (чтобы его можно было сделать быстрее)?
Если "другой" конец поддерживает его, вы можете использовать метод HEAD
HTTP?
Благодаря DaveHowes ответ и поиск по поводу того, как получить HEAD, я получил его таким образом:
URL url = new URL(urlname);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("HEAD");
connection.connect();
String contentType = connection.getContentType();
Помните о переадресации, я столкнулся с такой же проблемой с проверкой удаленного контента.
Вот мое исправление:
/**
* Http HEAD Method to get URL content type
*
* @param urlString
* @return content type
* @throws IOException
*/
public static String getContentType(String urlString) throws IOException{
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("HEAD");
if (isRedirect(connection.getResponseCode())) {
String newUrl = connection.getHeaderField("Location"); // get redirect url from "location" header field
logger.warn("Original request URL: '{}' redirected to: '{}'", urlString, newUrl);
return getContentType(newUrl);
}
String contentType = connection.getContentType();
return contentType;
}
/**
* Check status code for redirects
*
* @param statusCode
* @return true if matched redirect group
*/
protected static boolean isRedirect(int statusCode) {
if (statusCode != HttpURLConnection.HTTP_OK) {
if (statusCode == HttpURLConnection.HTTP_MOVED_TEMP
|| statusCode == HttpURLConnection.HTTP_MOVED_PERM
|| statusCode == HttpURLConnection.HTTP_SEE_OTHER) {
return true;
}
}
return false;
}
Вы также можете поместить некоторый счетчик для maxRedirectCount
, чтобы избежать бесконечного цикла перенаправления, но это не рассматривается здесь. Это просто вдохновение.