我正在尝试上传文件,但我收到以下错误:
"\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'
答案 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