2012-06-06 7 views
12

Ich bin auf der Suche nach einer Lösung, um dem Benutzer die Möglichkeit zu geben, mehrere Bilder durch ein file_field hochzuladen. Ich habe Optionen wie JQuery File Upload und Uploadify angeschaut, bin aber noch auf gute Beispiele mit einer funktionierenden Lösung gestoßen.Rails Büroklammer und mehrere Datei-Uploads

Ich habe bereits mehrere Bilder Setup,

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" 

Im Moment bin ich die Anzeige 5 Einzel 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 

Ich würde

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

haben möchte, dass der Benutzer ermöglicht, Wählen Sie mehrere Dateien in ihrem Dateibrowser aus. Aber wie kann ich diese mit einem verschachtelten Modell verarbeiten? Und sie zum Hochladen bringen.

Antwort

34

So gibt es ein paar Probleme hier.

Zunächst ist die has_attached_file Paperclip-Methode keine Verknüpfung zu vielen Dateien. Es sieht so aus, als ob Sie versuchen, ein "Asset" zu erstellen, als wäre es eine Rails-Assoziation. In Paperclock werden nur einige Felder in Ihre Tabelle eingefügt, um einige Metadaten über die Datei zu speichern. Sie erhalten eine angehängte Datei pro Deklaration von has_attached_file. Wenn Sie 5 Dateien anhängen möchten, müssten Sie etwas tun:

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

oder alternativ ein anderes Modell erstellen konnte nur die Dateien zu speichern. Zum Beispiel:

class Listing < ActiveRecord::Base 
    has_many :assets 
end 

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

Auf diese Weise könnten Sie zu einem Eintrag mehrere Assets angeschlossen haben (Sie hat nicht gesagt, was das ursprüngliche Objekt wurde so nur ich es als „listing“).

Zweitens gibt es keinen Upload von mehreren Dateien in HTML (und die file_field-Methode benötigt also kein Argument. Sie müssen etwas verwenden, das über Rails integrierte Formularbehandlung hinausgeht, wenn Sie möchten mehrere Dateien hochladen. "Uploadify" ist eine gute Wahl (die ich zuvor verwendet habe.) Es gibt ein Juwel, das Dateifelder transformiert, um uplofy zu verwenden (und die gewünschte Syntax unterstützt): https://github.com/mateomurphy/uploadify_rails3/wiki

Mein Rat wäre, Schritt für Schritt zu beginnen.Upload über Flash auf Rails kann ein komplizierter Prozess sein, der den Umgang mit dem CSRF-Meta-Tag und anderen Feldern in Ihrem Formular einbezieht. Beginnen Sie mit dem Erstellen eines Formulars, das einem Benutzer ermöglicht Laden Sie eine Datei hoch und speichern Sie sie über Paperclip. Dann brechen Sie vielleicht die Deklaration in ein anderes Modell, so dass Sie 1 oder viele Dateien mit einem Modell verbunden haben können (wie im Codeblock für mehrere Modelle oben gezeigt). Versuchen Sie dann, Uploadify oder eine andere Alternative hinzuzufügen. Ernie Miller hat ein anständiges Tutorial zur Integration von Uploadify: http://erniemiller.org/2010/07/09/uploadify-and-rails-3/.

Denken Sie daran, dass has_attached_file nur eine Datei anhängen kann. Wenn Sie versuchen, @listing.assets aufzurufen, gibt es keine "Assets". Es gibt ein Asset. Sie müssen ein separates Modell erstellen und die Rails-Verknüpfungen verwenden, wenn Sie mehrere Dateien benötigen.

+0

Ich habe bereits ein anderes Modell namens "Listing" erstellt. Ein Listing has_many Assets. Ich kann bereits mehrere Assets hochladen, nur nicht über ein einzelnes Feld "Datei auswählen". Wenn jemand gute Beispiele mit Uploadify hat, wäre das großartig. Ich bin nicht sicher, wie man den Hintergrund JS tut, um jedes Bild zu verarbeiten und sie zum Server richtig zu schicken. – kcollignon

+3

Sie können ': multiple =>" multiple "' zu Ihrem 'file_field' hinzufügen, das die Auswahl mehrerer Dateien aus einem HTML-Eingabefeld ermöglicht (zumindest in Chrome). Ich habe das Problem, diese Uploads noch nicht richtig zu verwalten, noch nicht gelöst, aber ich weiß, dass post-Parameter ein Array der mehreren Dateien enthält, die Sie ausgewählt und hochgeladen haben. –

+0

Und Sie müssen '' html => {: multipart =>: true} 'zu Ihrem' form_for' hinzufügen. –

2

Akzeptierte Antwort besagt, dass es kein Hochladen mehrerer Dateien in HTML gibt.

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

Damit können Sie mehrere Bilder auswählen und sie als Array senden.

Wenn Sie die Beziehung Dog has_many Images und Image has_attachment :file haben, tut dies mehr Bilder zu bekommen auf einmal zu:

In Ihrem html.erb

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

In Ihrem Controller

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

In Ihrem Hundemodell

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

Dies setzt voraus, dass Sie bereits ein Bild hochladen können, aber gleichzeitig auf mehrere Bilder aktualisieren möchten. Beachten Sie, dass die Wartezeit zunimmt.

Um Wartezeit zu verkürzen, meine post auf diese Frage guck auf Geschwindigkeit Upload bezogen.

Verwandte Themen