WordPress でアップロードできないファイルの確認のため、 PHP で MIMEタイプ を確認してみます。
経緯
自分で Markdown でメモを書いた後に、それを WordPress の投稿に投げておきたい、という場面に遭遇しました。
- どこにも記録を残さず削除するのは忍びない
- 大した内容ではないので記事文本文に転写するようなものでもない
という微妙なポジションの走り書きファイルをとりあえず記事に紐付けておきたい。どこかに保存しないのであればデスクトップがひたすら汚れていくか、いっそ記録を残さず削除するか……。
であれば .md
ファイル もメディアとしてファイルアップロードを受け付けるようにすれば良い、と考えました。
WordPress 標準だとそもそも .md
拡張子 がNGなので。
……ところで、 .md
って MIMEタイプ は何になるのでしょうか。
WordPress で一部の .xlsファイル だけがアップロードできない (解決)のプラグインで text/html
や text/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
であることが確認できました。
そこで先のプラグインの拡張子と 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 を再起動。これでエラー解消を確認しました。