web-dev-qa-db-ja.com

コンテンツタイプを取得する最も簡単な方法

ユーザーが挿入したURLのコンテンツタイプ(画像、音声、またはビデオの場合)を確認する必要があります。私はこのようなコードを持っています:

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

コンテンツタイプを取得していますが、問題は、ファイル全体をダウンロードしてコンテンツタイプを確認する必要があるように見えることです。そのため、ファイルが非常に大きい場合は長持ちします。リクエストが30秒に制限されるように、Google AppEngineアプリケーションで使用する必要があります。

ファイルをダウンロードせずにURLのコンテンツタイプを取得する他の方法はありますか(より速く実行できるように)?

15
Javi

「もう一方の」端がそれをサポートしている場合、HEAD HTTPメソッドを使用できますか?

20
DaveH

DaveHowesの回答と、取得方法についてグーグルで調べてくれたおかげでHEAD次のように取得しました:

URL url = new URL(urlname);
HttpURLConnection connection = (HttpURLConnection)  url.openConnection();
connection.setRequestMethod("HEAD");
connection.connect();
String contentType = connection.getContentType();
30
Javi

リダイレクトに注意してください。リモートコンテンツチェックで同じ問題に直面しました。
これが私の修正です:

/**
 * 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にカウンターを配置することもできますが、これについてはここでは説明しません。これは単なるインスピレーションです。

10
To Kra