Самый быстрый способ получить тип контента - PullRequest
12 голосов
/ 27 апреля 2011

Мне нужно проверить тип контента (если это изображение, аудио или видео) URL-адреса, который был вставлен пользователем.У меня есть такой код:

URL url = new URL(urlname);
URLConnection connection = url.openConnection();
connection.connect();
String contentType = connection.getContentType();

Я получаю тип контента, но проблема в том, что кажется, что необходимо загрузить весь файл, чтобы проверить его тип контента.Так что это слишком долго, когда файл довольно большой.Мне нужно использовать его в приложении Google App Engine, чтобы запросы были ограничены 30 секундами.

Есть ли другой способ получить тип содержимого URL-адреса без загрузки файла (чтобы это можно было сделать быстрее)

Ответы [ 3 ]

30 голосов
/ 27 апреля 2011

Благодаря ответу DaveHowes и поиску того, как получить ГОЛОВУ, я получил это следующим образом:

20 голосов
/ 27 апреля 2011

Если «другой» конец поддерживает это, не могли бы вы использовать HEAD HTTP-метод?

10 голосов
/ 07 мая 2015

Помните о перенаправлениях, я столкнулся с той же проблемой при удаленной проверке содержимого.
Вот мое исправление:

/**
 * 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, чтобы избежать бесконечного цикла переадресации - но здесь это не рассматривается. Это просто вдохновение.

...