- PHPでmimetypeについて調べました
- 方法は複数ありますが、finfoを使った取得方法がデファクトのようです
finfo(ローカルパス)
- ローカルパスに存在するファイルのmimetypeを取得出来る
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime_type = $finfo->file($url);
- 注意点
- リモートファイルは取得できない(エラーとなる)
- 設定でfinfoを有効化する必要がある
finfo_buffer(バイナリ)
- バイナリデータからmimetypeを取得する方法
- 上述の
finfo→file()
だとリモートファイルの情報を取得することは出来ないので、事前にリモートファイルをダウンロードしておき、finfo_buffer
で取得できる
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_buffer($finfo, $binary);
finfo_close($finfo);
get_headers
- HTTP リクエストに対するレスポンス内で サーバーによって送出されたヘッダの配列を返す
- 第2引数のassociativeをtrueにすることで、レスポンスがパースされ、配列のキーをセットしてくれる(逆にfalseだと数値添字で参照しなければならない)
$header = get_headers($url, true);
$mimeType = $header['Content-Type'];
- 返り値は以下のようになる
Array
(
[0] => HTTP/1.1 200 OK
[Date] => Sat, 29 May 2004 12:28:14 GMT
[Server] => Apache/1.3.27 (Unix) (Red-Hat/Linux)
[Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
[ETag] => "3f80f-1b6-3e1cb03b"
[Accept-Ranges] => bytes
[Content-Length] => 438
[Connection] => close
[Content-Type] => text/html
)
- 注意点
- リモートファイルの情報を取得するには、php.iniでallow_url_fopenが有効化されている必要がある
getimagesize
- 関数名から察せる通り、ファイルが画像だと分かっている場合に有効な手段
$imageInfo = getimagesize($url);
$mimeType = $imageInfo['mime'];
- 注意点
- リモートファイルの情報を取得するには、php.iniでallow_url_fopenが有効化されている必要がある
最後に
- mime_content_type関数を使った方法もありますが、使って良いのか分からない(過去に非推奨になっていたり、廃止になりかけたり..)ので今回は触れませんでした
- mime_content_typeは避けるべきなのか、使っても良いのかご存知の方がいれば教えて下さい…