letter_openerで添付ファイル名の日本語がアンダースコア(_)に変換されてしまう問題の解決方法

letter_openerで添付ファイル名の日本語がアンダースコア(_)に変換されてしまう問題の解決方法です。

letter_openerやletter_opener_webで添付ファイル名に日本語が含まれていると、
ダウンロード時に_に変換されてしまいます。

f:id:ihatov08:20200318170329p:plain f:id:ihatov08:20200318170439p:plain

問題のコードはこちら。

https://github.com/ryanb/letter_opener/blob/master/lib/letter_opener/message.rb#L122

    def attachment_filename(attachment)
attachment.filename.gsub(/[^\w\-.]/, '_')
end

日本語があると全部 _に変換しちゃってますね。。。

解決方法

パッチを当てるにあたって、

letter_openerやletter_opener_webのバージョンが古いと後述のコードを足しても治らないのでupdateします。

$ bundle update --source letter_opener
$ bundle update --source letter_opener_web

それぞれ以下のバージョン以上であれば問題ないです。

    letter_opener (1.7.0)
letter_opener_web (1.4.0)

実際のパッチがこちらです。

config/initializers/letter_opener/message.rb

if defined? LetterOpenerWeb
LetterOpener::Message.class_eval do
def attachment_filename(attachment)
URI.encode(attachment.filename)
end
end
end

問題のメソッドをclass_evalで上書きします。

ファイル名に日本語が含まれている場合は、エンコードするようにしました。

たいていletter_opener_webは開発環境(Rails.env.develpment?)でしか使わないと思うので、
if defined?で productionでも動作するようにしています。
これがないとproductionでrails起動時にエラーが発生します。

f:id:ihatov08:20200318171015p:plain

エンコードされたURLが埋め込まれて、ダウンロード時は日本語がファイル名に含まれるようになります。

本家にPR出した

本家にPRを出したのでマージされてほしい、、

github.com

コメントを残す

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