Webサイトなどでユーザーにファイルをアップロードさせファイル形式を判定して処理を行う場面があります。
画像ファイル、PDFファイル、Wordファイルなどがよくあるパターンですがプログラムの中ではファイルの種類を表す情報「mimetype」をもとに判定すると思います。
その際、Wordファイルの判定がうまく行かないファイルが存在することを知りました。
今までのwordファイルのmimetype判定に使用していた文字列
application/vnd.openxmlformats-officedocument.wordprocessingml.document
ファイルタイプは以下のコードで調べることができます。
$file_name = __DIR__ . 'target.docx';
$file_info = finfo_open(FILETYPE_MIME_TYPE);
var_dump(finfo_file($file_info, $file_name));
finfo_close($file_info);
うまく判定できなかった原因
googleドライブで作成したdocumentファイル(Wordに似たアプリケーション)からWord形式に変換したファイルの判定がPHPでうまくできていないからのようです。
このファイルのmimetypeをPHPのプログラムで判定すると
application/vnd.openxmlformats-officedocument.wordprocessingml.documentapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
という文字列がかえってきます。
なぜか複数の情報が連結されてしまっていました。
PHPのバグとして情報もあるようです。
▼Bug #78028 finfo_file reports duplicate mime type for some docx
files
https://bugs.php.net/bug.php?id=78028
このレポートを見るとPHPのバージョン7.2まではこの問題は発生せず7.3以降のバージョンで発生するようです。
Googleからの変換されたdocxファイルを判定するためには
使用可能なmimetype判定リストに
application/vnd.openxmlformats-officedocument.wordprocessingml.document
と
application/vnd.openxmlformats-officedocument.wordprocessingml.documentapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
を追加すると判定に引っかかってくれます。
あとはPHP自体の修正を待ちましょう。