LoginSignup
0
0

More than 1 year has passed since last update.

PHPで拡張子からMIMEタイプを取得する

Last updated at Posted at 2021-05-24

mime_content_typeがローカルファイルのみ有効だったため、何か方法が無いかと公式を見ていたら
ユーザ寄稿にこんなコードがありました。

Fast generation of uptodate mime types:

<?php
define('APACHE_MIME_TYPES_URL','http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types');

function generateUpToDateMimeArray($url){
    $s=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++)
                $s[]='&nbsp;&nbsp;&nbsp;\''.$out[1][$i].'\' => \''.$out[1][0].'\'';
    return @sort($s)?'$mime_types = array(<br />'.implode($s,',<br />').'<br />);':false;
}

echo
generateUpToDateMimeArray(APACHE_MIME_TYPES_URL);
?>

Output:
$mime_types = array(
   '123' => 'application/vnd.lotus-1-2-3',
   '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',
...

Enjoy.

何をやってるかというと、
APACHE_MIME_TYPES_URLには以下のURLが定義されており

中身はこのようにMIMEタイプと拡張子の対応表になってます。

application/andrew-inset            ez
# application/applefile
application/applixware              aw
# application/atf
# application/atfx
application/atom+xml                atom
application/atomcat+xml             atomcat
# application/atomdeleted+xml

要はこれを正規表現で拡張子をキーとした連想配列にして使えば早いよって事ですね。

連想配列作成例

    function getMimeTypes()
    {
        // 表の取得
        $list = file_get_contents('http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types');

        $mime_types = [];
        foreach (explode("\n", $list) as $row) {
            // 先頭が#のものはMIMEタイプが未登録の為スキップ
            if (str_contains($row, '#')) {
                continue;
            }
            // 正規表現でMIMEタイプと拡張子を取得
            if (preg_match('/^(\S+)\s+(.+)$/u', $row, $matches)) {
                // 拡張子はスペース区切りで複数存在するときもあるので分割(jpg, jpegとか)
                foreach (explode(" ", $matches[2]) as $extension) {
                    // 配列に拡張子をキーとして代入
                    $mime_types[$extension] = $matches[1];
                }
            }
        }
        return $mime_types;
    }
$mime_types = getMimeTypes();
echo $mime_types[pathinfo('http://example.com/hogehoge.jpg', PATHINFO_EXTENSION)];
// "image/jpeg"

今回WordpressからContentfulへのブログ移行の際に画像も移行する必要があったためこのような対応をしました。
移行プログラムがWordpressのサーバ内にあれば、mime_content_typeで事足りたんですが。
第三者がアップロードしたファイルのバリデーションには使わないこと。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0