tag:crieit.net,2005:https://crieit.net/tags/finfo/feed
「finfo」の記事 - Crieit
Crieitでタグ「finfo」に投稿された最近の記事
2021-12-22T00:02:36+09:00
https://crieit.net/tags/finfo/feed
tag:crieit.net,2005:PublicArticle/17882
2021-12-22T00:02:36+09:00
2021-12-22T00:02:36+09:00
https://crieit.net/posts/php-judge-mime-type-20211222
PHP で MIMEタイプ判定を行う (fileinfo 使用)
<p>WordPress でアップロードできないファイルの確認のため、 PHP で MIMEタイプ を確認してみます。</p>
<h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2>
<p>自分で Markdown でメモを書いた後に、それを WordPress の投稿に投げておきたい、という場面に遭遇しました。</p>
<ul>
<li>どこにも記録を残さず削除するのは忍びない</li>
<li>大した内容ではないので記事文本文に転写するようなものでもない</li>
</ul>
<p>という微妙なポジションの走り書きファイルをとりあえず記事に紐付けておきたい。どこかに保存しないのであればデスクトップがひたすら汚れていくか、いっそ記録を残さず削除するか……。</p>
<p>であれば <code>.md</code>ファイル もメディアとしてファイルアップロードを受け付けるようにすれば良い、と考えました。</p>
<p>WordPress 標準だとそもそも <code>.md</code>拡張子 がNGなので。</p>
<p>……ところで、 <code>.md</code> って MIMEタイプ は何になるのでしょうか。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://labor.ewigleere.net/2021/04/18/wordpress-upload-failed-certain-excel-2/">WordPress で一部の .xlsファイル だけがアップロードできない (解決)</a>のプラグインで <code>text/html</code> や <code>text/markdown</code> としても受け付けてくれなかったので。</p>
<h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2>
<p>ということでサクッとコードを書いて PHP 的に MIMEタイプ が何になるかを調べます。</p>
<p>もちろん、バージョンで判定が変わってしまうのは前提として。</p>
<pre><code class="php"><?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>
</code></pre>
<p>今回はこのような形でファイル名と MIMEタイプ を表示させるプログラムを書きました。</p>
<p><a href="https://crieit.now.sh/upload_images/448e5aa027e4ba3f45349d4c1f0850e361be0947253f8.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/448e5aa027e4ba3f45349d4c1f0850e361be0947253f8.jpg?mw=700" alt=".mdファイル は text/plain、いくつかのパターンで試した .zip はいずれも application/zip でした" /></a></p>
<p>これにより、 <code>.md</code>ファイル は <code>text/plain</code>、 いくつかのパターンで試した <code>.zip</code> はいずれも <code>application/zip</code> であることが確認できました。</p>
<p>そこで先のプラグインの拡張子と MIMEタイプ の一覧を以下のように変更。</p>
<pre><code class="php"> 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'
],
];
</code></pre>
<p>これでアップロードできるようになったことを確認。</p>
<h2 id="余談"><a href="#%E4%BD%99%E8%AB%87">余談</a></h2>
<p>XAMPP で動作確認を取る際に PHP のパッケージ読み込みで fileinfo が読み込まれておらずエラーになってしまいました。</p>
<p>そこで XAMPP の <code>php.ini</code> を編集。</p>
<pre><code class="ini">;extension=fileinfo
extension=fileinfo
</code></pre>
<p>コメントアウトを解除して XAMPP の Apache を再起動。これでエラー解消を確認しました。</p>
<h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/katsukii/items/ec816b23f68b6dfa0f87">PHPで任意のディレクトリ下にあるファイルを一覧取得する方法 - Qiita</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://colo-ri.jp/develop/2011/04/uploader-fileformat-detection.html">PHPでMIME-Typeを判定する方法 | colori</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://gray-code.com/php/get-kind-of-file/">ファイルの種類(MIMEタイプ)を確認する | GRAYCODE PHPプログラミング</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/kazu56/items/2c72d187438de07c2503">【PHP】特定の文字列を含むかのチェック - Qiita</a></li>
</ul>
arm-band