web-dev-qa-db-ja.com

PHP 5.5でファイルのMIMEタイプを取得するには?

MIMEタイプを取得するためにPHP 5.5でmime_content_type()を使用していますが、fatal: error function not found

PHP 5.5でこれを達成するにはどうすればよいですか?

34
Jitendra Yadav

finfo() 関数を使用します。

簡単な図:

<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo finfo_file($finfo, "path/to/image_dir/image.gif");
finfo_close($finfo);

OUTPUT :

image/gif

注:Windowsユーザーは、バンドルされたphp_fileinfo.dll DLLこの拡張機能を有効にするphp.iniのファイル。

57

私はfinfo関数を適切に機能させるために時間を費やしすぎました。最終的に、ファイル拡張子をmimeタイプの配列に一致させる独自の関数を作成しました。これは、ファイルが拡張機能が示すとおりのものであることを保証する完全な方法ではありませんが、サーバー上のファイルのI/Oを処理する方法によってその問題を軽減できます。

function mime_type($file) {

    // there's a bug that doesn't properly detect
    // the mime type of css files
    // https://bugs.php.net/bug.php?id=53035
    // so the following is used, instead
    // src: http://www.freeformatter.com/mime-types-list.html#mime-types-list

    $mime_type = array(
        "3dml" => "text/vnd.in3d.3dml",
        "3g2" => "video/3gpp2",
        "3gp" => "video/3gpp",
        "7z" => "application/x-7z-compressed",
        "aab" => "application/x-authorware-bin",
        "aac" => "audio/x-aac",
        "aam" => "application/x-authorware-map",
        "aas" => "application/x-authorware-seg",
        "abw" => "application/x-abiword",
        "ac" => "application/pkix-attr-cert",
        "acc" => "application/vnd.americandynamics.acc",
        "ace" => "application/x-ace-compressed",
        "acu" => "application/vnd.acucobol",
        "adp" => "audio/adpcm",
        "aep" => "application/vnd.audiograph",
        "afp" => "application/vnd.ibm.modcap",
        "ahead" => "application/vnd.ahead.space",
        "ai" => "application/postscript",
        "aif" => "audio/x-aiff",
        "air" => "application/vnd.Adobe.air-application-installer-package+Zip",
        "ait" => "application/vnd.dvb.ait",
        "AMI" => "application/vnd.amiga.AMI",
        "apk" => "application/vnd.Android.package-archive",
        "application" => "application/x-ms-application",
        // etc...
        // truncated due to Stack Overflow's character limit in posts
    );

    $extension = \strtolower(\pathinfo($file, \PATHINFO_EXTENSION));

    if (isset($mime_type[$extension])) {
        return $mime_type[$extension];
    } else {
        throw new \Exception("Unknown file type");
    }

}

編集:

Davuzのコメントに対処し(投票が増え続けるため)、これが「完全な証拠」ではないことを上部の疑似免責条項に入れたことを全員に思い出させたいと思います。それで、私の答えで私が提供したアプローチを考えるとき、それを覚えておいてください。

17
Erutan409

mime_content_type()は非推奨ではなく、正常に動作します。

なぜmime_content_type()がPHPで非推奨になったのですか?

http://php.net/manual/en/function.mime-content-type.php

PHP 5.3、現在は ビルトイン です。

9
Anuga

$finfo = finfo_open(FILEINFO_MIME_TYPE);はそれを行うべきです。

Php.netドキュメントから取得。あなたの関数は非推奨であり、おそらく既に削除されています。

http://www.php.net/manual/en/function.finfo-file.php

4
Y U NO WORK

以下を使用して画像サイズを取得します。

$infFil=getimagesize($the_file_name);

そして

echo $infFil["mime"]

getimagesizeは、MIMEキーを持ち、明らかに画像サイズも持っている連想配列を返します

私はそれを使用し、動作します

2
user3348274

file_get_contentsはファイル全体をメモリにアップロードすることを理解する必要があります。MIMEタイプのみを取得するのは良い方法ではありません。これでbufferメソッドとfile_get_contents関数を使用する必要はありません。場合。

エラーや警告を防ぐには、次のようにするのが良いでしょう。

$filename = 'path to your file';

if (class_exists('finfo')) {
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    if (is_object($finfo)) {
        echo $finfo->file($filename);
    }
} else {
    echo 'fileinfo did not installed';
}

また、$ finfo-> fileがスローすることを知っておく必要がありますPHP失敗した場合は警告します。

Fileinfoが正しくインストールされておらず、PHPの最新バージョンを使用している場合、ヘッダーからMIMEタイプを取得できます。

CURLを使用して、ヘッダーからMIMEタイプを取得できます。

    $ch = curl_init();
    curl_setopt_array($ch, array(
            CURLOPT_HEADER => true,
            CURLOPT_NOBODY => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_MAXREDIRS => 1,
            CURLOPT_URL => $link)
    );

    $headers = curl_exec($ch);
    curl_close($ch);

    if (preg_match('/Content-Type:\s(.*)/i', $headers, $matches)) {
        echo trim($matches[1], "\t\n\r");
    }else {
        echo 'There is no content type in the headers!';
    }

get_headers 関数を使用することもできますが、cURLリクエストよりも遅くなります。

$url = 'http://www.example.com';

$headers = get_headers($url, 1);

echo $headers['Content-Type'];
1
madlopt

これは、2つの非常に良い投稿を組み合わせて見つけた最良のソリューションです

// http://php.net/manual/en/function.mime-content-type.php#87856 に感謝

function getMimeContentType($filename, $ext)
{
    if(!function_exists('mime_content_type'))
    {
        if($mime_types = getMimeTypes())
        {
            if (array_key_exists($ext, $mime_types))
            {
                return $mime_types[$ext];
            }
            elseif (function_exists('finfo_open'))
            {
                $finfo  = finfo_open(FILEINFO_MIME);
                $mimetype = finfo_file($finfo, $filename);
                finfo_close($finfo);
                return $mimetype;
            }
        }
        return 'application/octet-stream';
    }
    return mime_content_type($filename);
}

// http://php.net/manual/en/function.mime-content-type.php#107798 に感謝

function getMimeTypes()
{
    $url = 'http://svn.Apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types';

    $mimes = array();
    foreach(@explode("\n",@file_get_contents($url)) as $x)
    {
        if(isset($x[0]) && $x[0]!=='#' && preg_match_all('#([^\s]+)#', $x, $out) && isset($out[1]) && ($c = count($out[1])) > 1)
        {
                for($i=1; $i < $c; $i++)
            {
                    $mimes[$out[1][$i]] = $out[1][0];
            }
        }
    }
    return (@sort($mimes)) ? $mimes : false;
}

これを使用してリンク:

$filename = '/path/to/the/file.pdf';
$ext = strtolower(array_pop(explode('.',$filename)));
$content_type = getMimeContentType($filename, $ext);

Mime_content_type関数がphpでサポートされなくなっても機能し続けます。

0
Llewellyn

BatのMimeTypeToolを使用します( https://github.com/lingtalfi/Bat

利用可能な場合はfileinfoを使用し、デフォルトでは「extension => mime type」マッピングに戻ります。

0
ling