フラッシュウィジェットから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行いません。
2ヶ月前にmimetype_fuについて知りたいと思っています。私たちに多くの時間を救ったでしょうか。 Upvoted。 –
mimetype_fuは本当に面白そうです。アップロードされたファイルがファイルシステムに存在する前に動作することができますか? – pkaeding