PHP で MIMEタイプ判定を行う (fileinfo 使用)

WordPress でアップロードできないファイルの確認のため、 PHP で MIMEタイプ を確認してみます。

経緯

自分で Markdown でメモを書いた後に、それを WordPress の投稿に投げておきたい、という場面に遭遇しました。

  • どこにも記録を残さず削除するのは忍びない
  • 大した内容ではないので記事文本文に転写するようなものでもない

という微妙なポジションの走り書きファイルをとりあえず記事に紐付けておきたい。どこかに保存しないのであればデスクトップがひたすら汚れていくか、いっそ記録を残さず削除するか……。

であれば .mdファイル もメディアとしてファイルアップロードを受け付けるようにすれば良い、と考えました。

WordPress 標準だとそもそも .md拡張子 がNGなので。

……ところで、 .md って MIMEタイプ は何になるのでしょうか。

WordPress で一部の .xlsファイル だけがアップロードできない (解決)のプラグインで text/htmltext/markdown としても受け付けてくれなかったので。

コード

ということでサクッとコードを書いて PHP 的に MIMEタイプ が何になるかを調べます。

もちろん、バージョンで判定が変わってしまうのは前提として。

<?php
$finfo = new finfo();
?>
    <table>
        <tr>
            <thead>
                <th>ファイル名</th>
                <th>MIMEタイプ</th>
            </thead>
        </tr>
<?php
foreach (glob('scan/*') as $file) {
    if (is_file($file) && strpos($file, '.gitkeep') === false) {
?>
        <tr>
            <th><?= htmlspecialchars($file, ENT_QUOTES, 'UTF-8'); ?></th>
            <td><?= htmlspecialchars($finfo->file( __DIR__ . '/' . $file, FILEINFO_MIME_TYPE), ENT_QUOTES, 'UTF-8'); ?></td>
        </tr>
<?php
    }
}
?>
    </table>

今回はこのような形でファイル名と MIMEタイプ を表示させるプログラムを書きました。

.mdファイル は text/plain、いくつかのパターンで試した .zip はいずれも application/zip でした
.mdファイル は text/plain、いくつかのパターンで試した .zip はいずれも application/zip でした

これにより、 .mdファイル は text/plain、 いくつかのパターンで試した .zip はいずれも application/zip であることが確認できました。

そこで先のプラグインの拡張子と MIMEタイプ の一覧を以下のように変更。

        return [
            [
                'xla|xls|xlt|xlw' => 'application/vnd.ms-office'
            ],
            [
                'xla|xls|xlt|xlw' => 'application/vnd.ms-excel'
            ],
            [
                'md|markdown' => 'text/plain'
            ],
            [
                'zip|xzip' => 'application/zip'
            ],
            [
                'zip|xzip' => 'application/z-zip'
            ],
            [
                'zip|xzip' => 'application/zip-compressed'
            ],
            [
                'zip|xzip' => 'application/x-zip-compressed'
            ],
            [
                'zip|xzip' => 'application/compressed'
            ],
            [
                'zip|xzip' => 'application/x-compressed'
            ],
            [
                'zip|xzip' => 'application/octet'
            ],
            [
                'zip|xzip' => 'application/octet-stream'
            ],
        ];

これでアップロードできるようになったことを確認。

余談

XAMPP で動作確認を取る際に PHP のパッケージ読み込みで fileinfo が読み込まれておらずエラーになってしまいました。

そこで XAMPP の php.ini を編集。

;extension=fileinfo
extension=fileinfo

コメントアウトを解除して XAMPP の Apache を再起動。これでエラー解消を確認しました。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。