ファイル名 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 系が使えなかったのでした。。。