RailsのファイルダウンロードでTypeErrorが出た問題と対処法
Railsでcarrierwaveを使っていて、S3にアップロードしたファイルをダウンロードする際、エラーが出ていたので、原因を調べて解決しました。
以下のようなエラーが出ていた。
TypeError (no implicit conversion of StringIO into String):
原因
Why does OpenURI treat files under 10kb in size as StringIO?
OpenURIでファイルを開く時に10kb以下のファイルだとOpenURIのBufferクラスがTempfileを作らずStringIOで処理するので、それをしないように設定を変更し、全てTempfileで処理するようにする。
解決
config/initializers/open-uri.rb
に以下を置いて解決。
require 'open-uri'
# Don't allow downloaded files to be created as StringIO. Force a tempfile to be created.
OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax')
OpenURI::Buffer.const_set 'StringMax', 0