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[]=' \''.$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で事足りたんですが。
第三者がアップロードしたファイルのバリデーションには使わないこと。