Ruby on Rails上传文件问题奇怪的utf8转换错误

时间:2011-02-14 04:00:00

标签: ruby ruby-on-rails-3 file-upload

我正在尝试上传文件,但我收到以下错误:

"\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'

3 个答案:

答案 0 :(得分:33)

我相信这是rails 3如何与ruby 1.9一起使用的变化,因为1.9支持编码,它会尝试将所有字符串转换为您在应用配置(application.rb)中设置的任何编码,通常这是'utf -8' 。

为避免编码问题以二进制模式打开文件,因此对于二进制可写模式,您的模式为'wb':

File.open(Rails.root.join('public', 'images', file.original_filename), 'wb') do |f|
  f.write(file.read)
end

答案 1 :(得分:1)

我在上传二进制文件方面遇到了类似的问题,你的解决方案奇怪地没有用,但是这个问题已经解决了,所以这里有其他人有同样的问题

file.tempfile.binmode

将此行放在File.open之前。我认为的原因是临时文件在自动上传后以非二进制模式打开,并且此行将其切换为二进制,因此rails不会尝试任何自动转换(如果是二进制文件,这是无意义的)。

答案 2 :(得分:0)

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