Pourquoi mon téléchargement de Flash vers Rails & amp; attachment_fu travail (il a quelque chose à voir avec le type de contenu)?

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

Question

J'essaie de télécharger un fichier depuis un widget flash vers mon application rails, qui utilise attachment_fu pour gérer les images en format uplaodé. J'utilise le flash pour le téléchargement, car cela facilite la sélection et le téléchargement de plusieurs fichiers. Cependant, je reçois cette erreur lorsque le contrôleur rails tente d'appeler save! sur l'objet ActiveRecord nouvellement créé:

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'

Il semble donc que le type de contenu n’est pas envoyé correctement. En fait, Flash envoie un type de contenu application / octet-stream , où je suppose qu'il s'agira de image / png (pour ce cas de test particulier). .

Mon code ActionScript 3.0 effectuant le téléchargement ressemble à ceci:

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]');

Les paramètres de formulaire sont tous présents dans le téléchargement Flash attendu du téléchargement normal par le navigateur. Après avoir exécuté un renifleur de paquets, la seule différence réelle que je peux constater est que le type de contenu est différent.

Le modèle utilise attachment_fu et ressemble à ceci:

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

Alors, comment puis-je réparer le type de contenu envoyé par Flash? Et, pourquoi attachment_fu fait-il confiance au type de contenu envoyé par le navigateur plutôt que de le déterminer lui-même, avec nombres magiques ou quelque chose?

J'ai remarqué que si je supprime le : content_type = > : image ou le validates_as_attachment , ou si je modifie le contrôleur pour appeler save (false) , l'objet est créé, mais attachment_fu ne fait pas son travail. de redimensionner l'image.

Était-ce utile?

La solution

Malheureusement, les téléchargements Flash sont toujours envoyés avec le type de contenu "application / octet-stream". La solution de contournement la plus simple serait probablement d'utiliser mimetype_fu pour deviner le type MIME dans un rappel before_validation . Paperclip intègre cette fonctionnalité.

Une autre option consiste à écraser is_image? d’utiliser votre processeur d’image pour déterminer si le fichier est une image (dans rmagick, par exemple, vous pouvez l’ouvrir et voir s’il contient des calques). Il s’agit là d’une solution beaucoup plus gourmande en ressources, mais qui garantit que vous acceptez tous les fichiers que vous pouvez traiter et aucun autre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top