このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています

WordファイルがPHPで認識されない!?それGoogleと関係あるかもしれません

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自体の修正を待ちましょう。