Frage

Ich versuche, eine Datei von einem Flash-Widget auf meine Rails-Anwendung zu laden, die attachment_fu uplaoded Bilder zu handhaben verwendet. Ich bin mit Flash zu laden, da sie es einfach macht, mehrere Dateien auswählen und hochladen. Allerdings bin ich immer diese Fehlermeldung, wenn die Schienen-Controller versucht save! auf der neu erstellten Active Objekt aufzurufen:

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'

So scheint es, dass der Inhaltstyp nicht korrekt gesendet wird. Wie in der Tat ist der Blitz einen Inhaltstyp von application/octet-stream senden, wo ich es erwarten würde image/png (für diesen speziellen Testfall) sein.

My Actionscript 3.0-Code, der den Upload wie folgt aussieht ausführt:

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

Die Formparameter sind alle in dem Flash-Upload, die Sie aus dem normalen Browser-Upload erwarten. einen Paket-Sniffer, der einzige wirkliche Unterschied sehe ich nach dem Laufen ist, dass der Inhaltstyp unterschiedlich ist.

Das Modell verwendet attachment_fu, andlooks wie folgt aus:

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

Also, wie kann ich den Inhaltstyp zu beheben, die Flash sendet? Und warum tut attachment_fu dem Inhaltstyp vom Browser gesendete zu vertrauen, anstatt es auf seinem eigenen Bestimmung, mit magische Zahlen oder etwas?

Ich habe bemerkt, dass wenn ich die :content_type => :image oder die validates_as_attachment entfernen, oder wenn ich den Controller ändern save(false) aufrufen, wird das Objekt erstellt, aber attachment_fu macht nicht seine Aufgabe, das Bild der Größe ändern.

War es hilfreich?

Lösung

Leider Flash-Uploads sind immer mit Inhaltstyp "application / octet-stream" gesendet. Wahrscheinlich wäre die einfachste Abhilfe benutzen mimetype_fu MIME-Typen in einem before_validation Rückruf zu erraten . Büroklammer diese Funktionalität hat eingebaut.

Eine weitere Option ist is_image zu überschreiben? Ihren Bildprozessor zu verwenden, bestimmen tatsächlich, ob die Datei ein Bild (in RMagick zum Beispiel, können Sie sie öffnen und sehen, ob es irgendwelche Schichten). Dies ist definitiv eine ressourcenintensiver Lösung, aber es stellt sicher, dass Sie alle Dateien akzeptieren Sie verarbeiten können und keine andere.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top