2009-05-08 1 views
1

フラッシュウィジェットからraplアプリケーションにファイルをアップロードしようとしています。このアプリケーションでは、アップロードされた画像を処理するためにattachment_fuを使用しています。複数のファイルを簡単に選択してアップロードできるように、Flashを使用してアップロードしています。レール・コントローラは、新しく作成されたのActiveRecordオブジェクトにsave!を呼び出そうとした場合しかし、私はこのエラーを取得しています:なぜFlashからRails&attachment_fuへのアップロードがコンテンツに関係していないのですか?

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' 

だから、コンテンツタイプが正しく送信されていないようです。実際には、Flashはapplication/octet-streamのコンテンツタイプを送信しています。ここでは、image/png(この特定のテストケースの場合)と期待しています。アップロードを行い

私のActionScript 3.0のコードは次のようになります。

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

フォームパラメータは、すべてのあなたは、通常のブラウザのアップロードから期待フラッシュのアップロード中に存在しています。パケットスニッファを実行した後、私が見ることのできる唯一の違いは、コンテンツタイプが異なることです。モデルはattachment_fuを使用しています

、このようなandlooks:だから

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 

、どのように私は送信Flashコンテンツのタイプを修正できますか?そして、attachment_fuが、ブラウザで送信されたコンテンツタイプを、それ自身で判断するのではなく、magic numbersなどを使用して信頼するのはなぜですか?

私は:content_type => :imageまたはvalidates_as_attachmentを削除する場合、私はsave(false)を呼び出すために、コントローラを変更した場合、または、オブジェクトが作成されることに気づいたが、画像をリサイズのその仕事をattachment_fu行いません。

答えて

5

残念ながら、Flashアップロードは常にコンテンツタイプ "application/octet-stream"で送信されます。おそらく最も簡単な回避策は、mimetype_fuを使用してbefore_validationコールバックのmimetypeを推測することです。 Paperclipにはこの機能が組み込まれています。

もう一つのオプションはis_imageを上書きすることですか?イメージプロセッサを使用してファイルがイメージであるかどうかを実際に判断します(たとえば、rmagickでは、イメージを開いてレイヤーがあるかどうかを確認できます)。これは間違いなくよりリソース集約型のソリューションですが、処理できるファイルはすべて受け入れ、他のファイルは受け入れないようにします。

+0

2ヶ月前にmimetype_fuについて知りたいと思っています。私たちに多くの時間を救ったでしょうか。 Upvoted。 –

+0

mimetype_fuは本当に面白そうです。アップロードされたファイルがファイルシステムに存在する前に動作することができますか? – pkaeding

関連する問題