WordPressにメールから投稿できるプラグインはいくつかあるけれど、不特定多数からの投稿が可能で(K-tai Entryはこれがダメらしい)、かつ別サイトのアカウント作成も要らない(JetpackはWordPress.comへのアカウント作成が必要) プラグインということで、Postieを使ってみた。
・・・のはいいが、自分の環境だとAndroidやPCから写真を添付すると問題なく更新してくれたが、iPhoneからだと写真が投稿されないという問題が発生。どうやら写真のファイル名に全角文字が入っている(iPhoneだと「写真.JPG」というファイル名になる) と、写真がアップロードされない模様。
新年一発目は、この問題に対応するためのハックから。続きは以下に。
具体的には、全角文字のファイル名だと添付ファイルが __JPG という拡張子なしのファイルになってしまい、WordPressのセキュリティチェックに引っかかってアップロードできない感じ。画像処理部分のデバッグログを見ると、こんな感じになっていた。
GetContent: primary= image, secondary = jpeg DecodeBase64Part: base64 detected GetContent: file name 'JPG' GetContent: extension '' GetContent: secondary lookup failed, checking configured extensions GetContent: found no extension GetContent: mimetype image/jpeg image Attachement: JPG pre-sanitize name: __.JPG, size: 684699 post sanitize name: JPG using post date postie_handle_upload: detected file type for JPG is File type does not meet security guidelines. Try another.
正常にアップロードされると、こんな感じのログになる。
GetContent: primary= image, secondary = jpeg DecodeBase64Part: base64 detected GetContent: file name 'testfile.jpg' GetContent: extension 'jpg' GetContent: secondary lookup found image/jpeg GetContent: mimetype image/jpeg image Attachement: testfile.jpg pre-sanitize name: testfile.jpg, size: 459377 post sanitize name: testfile.jpg using post date postie_handle_upload: detected file type for testfile.jpg is image/jpeg wp_unique_filename: testfile.jpg attachement id: 21 wp_generate_attachment_metadata wp_update_attachment_metadata complete
iPhoneの設定で添付ファイル名は変更できるかもしれないけれど、自分だけならまだしも、不特定多数からの投稿を受け付ける必要があり、またそのためのレクチャーや設定方法を告知する時間もなく、さらには利用者のスキルに全く期待できないという3拍子揃った(悪い方に) 状況であったため、プラグインを書き換えることで対処することにした。
作業としては、WordPress 3.8・Postie 1.5.17の環境で、Postieプラグインディレクトリの、
postie-functions.php
を書き換えた。
1065行目当たりの
$filename = sanitize_file_name($filename);
を
$filename = sanitize_file_name('photo' . date("YmdHis") . '.' . $filename);
に、
1936行目あたりの、
$name = sanitize_file_name($name);
を
$name = sanitize_file_name('photo' . date("YmdHis") . '.' . $name);
にそれぞれ書き換えた。
これで再度iPhoneから設定したメールアドレスに写真添付メールを送ったところ、問題なく画像が投稿された。もちろん複数枚の添付もOK。デバッグログも以下のような感じでエラーがないことを確認。(pre-sanitize name は __.JPG のままだけど、この処理部分はエラーチェックに関係なさそうだったので書き換えなかった)
GetContent: primary= image, secondary = jpeg DecodeBase64Part: base64 detected GetContent: file name 'photo20140101065641.__.JPG' GetContent: extension 'jpg' GetContent: secondary lookup found image/jpeg GetContent: mimetype image/jpeg image Attachement: photo20140101065641.__.JPG pre-sanitize name: __.JPG, size: 136359 post sanitize name: photo20140101065641.__.JPG using post date postie_handle_upload: detected file type for photo20140101065641.__.JPG is image/jpeg wp_unique_filename: photo20140101065641.__.jpg attachement id: 30 wp_generate_attachment_metadata wp_update_attachment_metadata complete
date(“YmdHis”) を追加したのは、ファイル名がそのままアップロードファイル名になるため、重複すると上書きされるかなーという気がしたため。2ケタくらいの乱数も追加しようかと思ったけど、そこまで一気に大量の投稿はないだろうということで、投稿日時までに留めた。
本来なら __.JPG の時のみファイル名を書き換える処理の方がいいと思うけど、そこまで厳密なチェックが必要な案件でもないし、半角英数字のファイルでもファイル名がダブって上書きされる可能性を考えたら、この処理でも良かったのかなーとも思ったり。あと、書き換えるの簡単なので、Postieがバージョンアップしても追随しやすいし。
それから、1065行目の方はもしかしたら書き換えなくても動くような気もするけど、上から順にコードを追っていった関係で、書き換えたままに。戻して動かなくなったりしても面倒だしね。
以上、同様の問題が発生している方で、参考になれば幸いです。