PHP5.1でContent-Typeを取得してファイル表示

php5.1でサーバー上のファイルを表示することとなりました。

finfo_openでMIMEタイプを取得して、headerで出力して余裕。と思っていたのですが、finfo_openってphp5.3以降でないと使用できなかったんですね。

Linuxのコマンドで無理やりMIMEタイプ取得すんぞ

まあ、Linuxのコマンドで取得しようと考えるに至るまでにはそんなに時間がかからなかったのですが。 確かLinuxのコマンドでMIMEタイプを表示できるコマンドが有った様な・・・はい、有りました

で、早速サンプルコードを書いてみました。

$filePath = './test.php';

$cmd = 'file -bi ' . $filePath;
$type = exec($cmd);

echo $type . "\n";
実行結果
text/plain; charset=us-ascii

できたし。結構余裕だし(どや顔)。

これ開発環境で動かないんですけど

ちなみに本番環境はLinuxなんですが、開発環境はWindows(xampp)なおかげで「これ動かないよ」って指摘されることは必須なわけです。
こうなると先のどや顔も裏目に、「いや、本番では動くよ」っていっても言い訳にしかならず恥ずかしさ倍増なわけです。

ここは辱めを受けるくらいなら、小さいプライドは捨ててこんな感じにしちゃいましょう。

if('Linux' == PHP_OS)
{
    $cmd = 'file -bi ' . $filePath;
    $type = exec($cmd);
}
else
{
    $type = 'application/octet-stream';
}

// ファイルを表示
header('Content-Type: '.$type);
header('Content-Disposition: inline; filename="'.basename($filePath).'"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.filesize($filePath));
readfile($filePath);

言い忘れてましたが、想定されるファイルは画像とPDFなので、ブラウザでそのまま表示されるのが理想なんです。

こうすることによって、「いやー、PHP5.1じゃ動かなかったからー」なんて含みを持たせつつ強がることができるわけですな。

これダウンロードのダイアログが出てくるんですけど

でしょうね。そうでしょうね。それ、仕様ってことでなんとかなりませんか。

開発環境もLinuxにするわけにはいかないし、こういう場合はどうするのが理想なんだろ。
MIMEタイプ取得関数自作かな。

コメントを残す