GUiLZ Project Personal & Experimental Blog

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行目の方はもしかしたら書き換えなくても動くような気もするけど、上から順にコードを追っていった関係で、書き換えたままに。戻して動かなくなったりしても面倒だしね。

以上、同様の問題が発生している方で、参考になれば幸いです。

スポンサードリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

当サイトのコメント欄は承認制となっております。また、日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

スポンサードリンク

Twitter
利用中のサービス

GUiLZ Project では、以下のサービスを利用しています。


関連サイト
巡回先サイト様
アーカイブ