概要
- WordPressで特定のファイルがアップロードできない
- 「セキュリティ上の理由で」と表示される
- ある時からアップロードできない
原因
WordPress 5.0.1以上
ファイルチェックが厳格になったらしい。以下のようなコードを通じて得られた「正しいmime type」と比較して、アップロードを制御するようになった。その結果、拡張子はあっていても、本当のファイル形式?が違うとアップロードさせない。
$finfo = finfo_open( FILEINFO_MIME_TYPE );
$real_mime = finfo_file( $finfo, $file );
ファイル形式が複数存在する
上記の問題を解決するには、シンプルに以下のように書く(functions.phpとかに)。例えば、mp3, m4a, m4b が mpeg だけど、ちょっと違うことがある。AudioBook Binder (Mac)で作成したファイルは、 video/mp4 となってしまう。
add_filter( 'upload_mimes', function ( $mime_types ) {
unset( $mime_types[ 'mp3|m4a|m4b' ] );
$mime_types[ 'mp3' ] = 'audio/mpeg';
$mime_types[ 'm4a' ] = 'audio/mpeg';
$mime_types[ 'm4b' ] = 'video/mp4';
return $mime_types;
} );
一見解決したように見えるが、 AudioBook Builder (Mac) で m4b を作成すると、audio/x-m4a
という形式になってしまう。つまり、同じ拡張子で複数のmime type が存在する。
このような状況に対して、WordPressでは簡単に解決する方法は用意されていないらしい。wp_check_filetype_and_ext でごちゃごちゃすると良いらしい。