Rails 6にアップグレードすると発生する問題
Railsでファイルダウンロード機能を実装するときはsend_data
メソッドやsend_file
メソッドがよく使われます。
このとき、ファイル名に日本語(正確には非ascii文字)が含まれていると、IEやEdgeで文字化けします。
そのため、Rails 5.2以前では以下のようにERB::Util.url_encode
メソッドを使って文字化けを防いでいました。
class FooController < ApplicationController
# ...
def download
# ...
# Rails 5.2以前ではurl_encodeをかけないと、IEやEdgeでダウンロードしたときに
# `縺ォ縺サ繧薙#.txt`のようなファイル名になってしまっていた
send_data(your_data, filename: ERB::Util.url_encode('にほんご.txt'), disposition: 'attachment')
end
end
しかし、RailsアプリケーションをこのままRails 6にアップグレードすると、再びファイル名が文字化けします。
(IEやEdgeのみならず、Chrome等でも文字化けします)
# Rails 5.2でダウンロードしたときのファイル名
にほんご.txt
# Rails 6.0でダウンロードしたときのファイル名
%E3%81%AB%E3%81%BB%E3%82%93%E3%81%94.txt
原因
これはRails 6でファイル名がデフォルトでエンコードされるようになったのが原因です。
解決策
Rails 6ではデフォルトでエンコードされるので、ERB::Util.url_encode
を挟まずにsend_data
メソッドやsend_file
メソッドを呼び出してください。
-send_data(your_data, filename: ERB::Util.url_encode('にほんご.txt'), disposition: 'attachment')
+send_data(your_data, filename: 'にほんご.txt', disposition: 'attachment')
こうすれば、どのブラウザでも文字化けせずに日本語のファイル名でダウンロードすることができます。