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