2012-06-06 7 views
12

私は、1つのfile_fieldを通して複数の画像をアップロードするためのソリューションを探しています。私はそのようなJquery File UploadとUploadifyのオプションを見てきましたが、実際のソリューションで良い例を見つけていません。Rails Paperclip&Multiple File Uploads

私はすでに、複数の画像の設定は、

has_attached_file :asset, 
        :styles => { :large => "640x480", :medium => "300x300", :thumb => "100x100" }, 
        :storage => :s3, 
        :s3_credentials => "#{Rails.root}/config/s3.yml", 
        :path => "/:contributor_id/:listing_name/:filename" 

今私が表示しています5個々file_fields

def new 
    @listing = Listing.new 
    5.times {@listing.assets.build } 

    respond_to do |format| 
    format.html # new.html.erb 
    format.json { render json: @listing } 
    end 
end 

は、私は、ユーザーを許可する

<%= f.file_field :asset, :multiple => true %> 

がしたい持っていますファイルブラウザで複数のファイルを選択します。しかし、ネストされたモデルでこれらをどのように処理できますか?アップロードするようにしてください。

答えて

34

ここにいくつかの問題があります。

まず、Paperclipのhas_attached_fileメソッドは、多くのファイルに関連付けられていません。あたかもRails関連のように「資産」を構築しようとしているようです。すべてのPaperclipは、ファイルに関するいくつかのメタデータを格納するためにテーブルにいくつかのフィールドを入れて、has_attached_fileの宣言ごとに1つの添付ファイルを取得します。代わりに、あなただけのファイルを格納するために別のモデルを作成することができ、

has_attached_file :asset1 
has_attached_file :asset2 
has_attached_file :asset3 
has_attached_file :asset4 
has_attached_file :asset5 

をOR:あなたは5つのファイルを添付したい場合は、のような何かをする必要があります。たとえば:

class Listing < ActiveRecord::Base 
    has_many :assets 
end 

class Asset < ActiveRecord::Base 
    belongs_to :listing 
    has_attached_file :picture 
end 

こうすることで、あなたは1つのリストに接続された複数の資産を持つことができます(元のオブジェクトは、私はちょうど「リスト」と呼んでいたものと言っていませんでした)。

第2に、HTML形式で複数のファイルをアップロードするなどのことはありません(file_fieldメソッドは:multiple => true引数を取らないため、Rails組み込みフォーム処理以外のものを使用する必要があります。あなたは複数のファイルをアップロードする必要があります。Uploadifyは適切な選択です(これまで私が使用していたものです)。https://github.com/mateomurphy/uploadify_rails3/wikiを使用してアップロードするファイルフィールドを変換する宝石があります。

FlashからRailsへのアップロードは、フォームのCSRFメタタグやその他のフィールドを扱う複雑なプロセスになる可能性があります。まず、ユーザーが次のことを可能にするフォームを作成します。 1つのファイルをアップロードし、それをPaperclipで保存します。次に、has_attached_file宣言を別のモデルに分解して、1つまたは複数のファイルをモデルに関連付けることができます(上記の複数モデルのコードブロックに示すように)。次に、Uploadifyや別の方法を追加してみてください。 Ernie MillerはUploadifyを統合する上で相応しいチュートリアルを持っています:http://erniemiller.org/2010/07/09/uploadify-and-rails-3/

has_attached_fileと1つだけファイルを添付できることに注意してください。 @listing.assetsを呼び出すと、「アセット」はありません。 アセットがあります。複数のファイルが必要な場合は、別々のモデルを自分で作成し、Railsの関連付けを使用する必要があります。

+0

私はすでに「リスト」と呼ばれる別のモデルを作成しています。リスティングhas_manyアセット。私はすでに複数のアセットをアップロードできますが、1つの[ファイルを選択]フィールドではできません。誰かが良い例をアップロードして使用している場合、それは素晴らしいだろう。私はバックグラウンドJSをどのようにして各画像を処理し、それらをサーバーに適切にPOSTするのかはわかりません。 – kcollignon

+3

':multiple =>' multiple "を' file_field'に追加すると、少なくとも1つのhtmlファイル入力フィールドから複数のファイルを選択できます(少なくともChromeでは)。これらのアップロードを適切に管理するという問題はまだ解決していませんが、postパラメータには、選択してアップロードした複数のファイルの配列が含まれています。 –

+0

また、 ':html => {:multipart =>:true}'を 'form_for'に追加する必要があります。 –

2

受け入れられた答えは、HTMLに複数のファイルをアップロードするということはないという。

<%= f.file_field :files, multiple: true %> 

これにより、複数の画像を選択して配列として送信することができます。

あなたは関係Dog has_many ImagesImage has_attachment :fileを持っている場合は、一度にアップロードするために複数の画像を取得するには、この操作を行います。あなたのhtml.erbで

<%= form_for @dog, html: { multipart: true } do |f| %> 
    <%= f.file_field :files, accept: 'image/png,image/jpeg,image/gif', multiple: true %> 
<%= end %> 

お使いのコントローラで

def dog_params 
    params.require(:dog).permit files: [] 
end 

あなたの犬モデルで

def files=(array = []) 
    array.each do |f| 
    images.create file: f 
    end 
end 

これは既に1つの画像をアップロードできるが、複数の画像に同時にアップグレードしたいと仮定している。待ち時間が増えることに注意してください。

待機時間を短縮するため、速度のアップロードに関するこの質問で私のpostを覗いてください。

関連する問題