2011-02-14 723 views
10

estoy tratando de cargar un archivo y estoy recibiendo el siguiente error:Ruby on Rails subir problema de los archivos UTF8 extraño error de conversión

"\xFF" from ASCII-8BIT to UTF-8 

Estoy más o menos siguiendo las guías de los carriles en lo que están haciendo. Aquí está el código que estoy usando.

file = params[:uploaded_file] 

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

No entiendo por qué no funciona. ¿Qué estoy haciendo mal?

Actualización - Aquí está la traza aplicación

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' 

Respuesta

33

Creo que esto es un cambio en la forma de los carriles 3 trabaja con Ruby 1.9, 1.9 ya soporta codificaciones que intentará convertir todas las cadenas a cualquier codificación que tiene configurado en la configuración de su aplicación (application.rb), generalmente esto es 'utf-8'.

para evitar el problema de codificación abrir el archivo en modo binario, por lo que su modo habría 'wb' para permisos de escritura binaria:

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

He creado una solicitud de extracción para corregir esto en las guías. Crucemos los dedos :) https://github.com/rails/rails/pull/11910 –

1

había problema similar con la carga de archivos binarios y su solución extrañamente no funcionó , pero éste tenía, por lo que aquí es para cualquier otra persona tienen el mismo problema

file.tempfile.binmode 

poner esta línea antes File.open. I think La razón es que el archivo temporal se abre en modo nonbinary después de cargarlo automáticamente, y esta línea lo cambia a binario, por lo que los raíles no intentan ninguna conversión automática (lo cual es una tontería en el caso del archivo binario).

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