tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

ファイル名 or 拡張子から content-type(MIME type) を決める

  • 実ファイルにアクセスできる場合: File::MMagic or File::MMagic::XS
  • できない場合: File::MimeInfo の globs()

File::MimeInfo の場合はこんな感じ。

use strict;
use warnings;
use File::MimeInfo qw(globs);
my $type;
$type = globs("a.txt");
warn $type;
$type = globs("a.jpg");
warn $type
$ perl a.pl
text/plain at a.pl line 6.
image/jpeg at a.pl line 8.

実アプリで使うなら、globs は eval で囲っておくことと、content-type が取れなかったらデフォルトで application/octet-stream あたりを返すようにしておくほうがいいかな。

ちなみに、移植性とか無視でいいなら、shared-mime-info が入っているディレクトリ (/usr/share/mime/ とか)から、globs というファイルを引っ張り出して、このリストを使うのが手っ取り早いかも。File::MimeInfo のソースみたけど、あんまりきれいじゃなかったので。。。File::MimeInfo の globs() も globs をスキャンした内容と照合かけてるだけです。

なお、「Perl Content-type」とかそんな感じで検索かけたら、古きよき(?) CGI/Perl4 なサンプルばっかりひっかかって結構げんなりでした。通常なら、ファイルにアクセスできるだろうから、迷わず File::MMagic(::XS)を使うのが吉だと思います。

今回はファイルサーバ(FTPサーバ)がアプリサーバと分かれていて、しかも(私が書いたわけではない)プログラムの改修で、かつそのプログラムが STDOUT に直接書き出す、ということをしていたので、File::MMagic 系が使えなかったのでした。。。