2011-02-14 46 views
10

我想上傳一個文件,我收到以下錯誤: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' 

回答

33

我相信這是怎麼軌道3件作品紅寶石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 
+2

我已經在指南中創建了拉取請求來更正此問題。手指交叉:) https://github.com/rails/rails/pull/11910 – 2013-08-16 02:11:40

1

我曾與上傳二進制文件,你的解決方案類似的問題,奇怪的是沒有工作,但這是一個,所以這裏是其他人有相同的問題

​​

把這行放在File.open之前。我認爲原因是臨時文件在自動上傳後以非二進制模式打開,並且該行將其切換爲二進制文件,因此rails不會嘗試任何自動轉換(在二進制文件的情況下這是無意義的)。

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