0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PHPでmimetypeを取得する方法

Posted at
  • 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は避けるべきなのか、使っても良いのかご存知の方がいれば教えて下さい…
0
3
1

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
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?