LoginSignup
33
17

More than 3 years have passed since last update.

Rails 6ではsend_data/send_fileメソッド呼び出し時にERB::Util.url_encodeは不要です

Last updated at Posted at 2020-01-20

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')

こうすれば、どのブラウザでも文字化けせずに日本語のファイル名でダウンロードすることができます。

33
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
17