¿Por qué mi carga de Flash a Rails & amp; attach_fu work (tiene algo que ver con el tipo de contenido)?

StackOverflow https://stackoverflow.com/questions/838268

Pregunta

Estoy tratando de cargar un archivo desde un widget flash a mi aplicación de rieles, que utiliza attach_fu para manejar imágenes cargadas. Estoy usando flash para cargar, ya que facilita la selección y carga de múltiples archivos. Sin embargo, recibo este error cuando el controlador de rails intenta llamar a save! en el objeto ActiveRecord recién creado:

ActiveRecord::RecordInvalid (Validation failed: Content type is not included in the list):
    /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/validations.rb:946:in `save_without_transactions!'
    /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/transactions.rb:112:in `save!'
    /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/database_statements.rb:66:in `transaction'
    /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/transactions.rb:80:in `transaction'
    /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/transactions.rb:100:in `transaction'
    /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/transactions.rb:112:in `save!'
    /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/transactions.rb:120:in `rollback_active_record_state!'
    /usr/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/transactions.rb:112:in `save!'
    /app/controllers/photos_controller.rb:13:in `create'
    /usr/local/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:1158:in `send'
    /usr/local/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:1158:in `perform_action_without_filters'
    /usr/local/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:697:in `call_filters'
    /usr/local/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:689:in `perform_action_without_benchmark'
    /usr/local/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'

Entonces, parece que el tipo de contenido no se está enviando correctamente. De hecho, Flash está enviando un tipo de contenido de application / octet-stream , donde esperaría que fuera image / png (para este caso de prueba en particular) .

Mi código ActionScript 3.0 que realiza la carga tiene este aspecto:

var request:URLRequest = new URLRequest(paramObj.serverUrl + "/albums/" + paramObj.albumId + "/photos");
var variables:URLVariables = new URLVariables();
variables["photo[title]"] = file.name;
variables["authenticity_token"] = paramObj.authenticity_token;
variables["commit"] = "Upload Photo";
request.data = variables;
request.method = URLRequestMethod.POST;
file.upload(request, 'photo[uploaded_data]');

Todos los parámetros del formulario están presentes en la carga Flash que espera de la carga normal del navegador. Después de ejecutar un sniffer de paquetes, la única diferencia real que puedo ver es que el tipo de contenido es diferente.

El modelo usa attach_fu, y se ve así:

class Photo < ActiveRecord::Base
  belongs_to :album

  has_attachment :content_type => :image, 
                 :storage => :file_system, 
                 :max_size => 10.megabytes, 
                 :thumbnails => { 
                   :thumb  => '100x100>',  
                   :large  => '800x600>', 
                 } 

  validates_as_attachment
end

Entonces, ¿cómo puedo arreglar el tipo de contenido que envía Flash? Y, ¿por qué attach_fu confía en el tipo de contenido enviado por el navegador, en lugar de determinarlo por sí solo, usando números mágicos o algo así

He notado que si elimino el : content_type = > : imagen o validates_as_attachment , o si cambio el controlador para llamar a save (false) , el objeto se crea, pero attach_fu no hace su trabajo de cambiar el tamaño de la imagen.

¿Fue útil?

Solución

Desafortunadamente, las cargas Flash siempre se envían con el tipo de contenido "application / octet-stream". Probablemente la solución más fácil sería usar mimetype_fu para adivinar el tipo mime en una devolución de llamada before_validation . Paperclip tiene esta funcionalidad incorporada.

Otra opción es sobrescribir is_image? para usar su procesador de imágenes para determinar realmente si el archivo es una imagen (en rmagick, por ejemplo, puede abrirlo y ver si tiene alguna capa). Esta es definitivamente una solución que requiere más recursos, pero garantiza que acepte todos los archivos que puede procesar y no otros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top