Ruby on Rails上传文件问题奇怪的utf8转换错误
我正在尝试上传文件,我收到以下错误:
"\xFF" from ASCII-8BIT to UTF-8
我正在跟踪导轨指南他们正在做什么。 这是我正在使用的代码。
file = params[:uploaded_file] File.open(Rails.root.join('public', 'images', file.original_filename), 'w') do |f| f.write(file.read) end
我不明白为什么它不起作用。 我究竟做错了什么?
更新 – 这是应用程序跟踪
app/controllers/shows_controller.rb:16:in `write' app/controllers/shows_controller.rb:16:in `block in create' app/controllers/shows_controller.rb:15:in `open' app/controllers/shows_controller.rb:15:in `create'
我相信这是rails 3与ruby 1.9一起工作的一个变化,因为1.9支持编码,它会尝试将所有字符串转换为你在app配置(application.rb)中设置的任何编码,通常这是’utf-8′ 。
为避免编码问题,请以二进制模式打开文件,因此对于二进制可写模式,您的模式为’wb’:
File.open(Rails.root.join('public', 'images', file.original_filename), 'wb') do |f| f.write(file.read) end
我上传二进制文件有类似的问题,你的解决方案奇怪地没有用,但是这个有,所以这里有其他人有同样的问题
file.tempfile.binmode
把这行放在File.open之前。 我认为原因是临时文件在自动上传后以非二进制模式打开,并且此行将其切换为二进制,因此rails不会尝试任何自动转换(在二进制文件的情况下这是无意义的)。
dst_path = Rails.root.join('public', 'images', file.original_filename) src_path = params[:uploaded_file].path IO.copy_stream(src_path, dst_path) # http://ruby-doc.org/core-1.9.2/IO.html#method-c-copy_stream