2012-06-06 10 views
12

Estoy buscando una solución para darle al usuario la capacidad de cargar múltiples imágenes a través de un file_field. He buscado opciones como Jquery File Upload y Uploadify, pero todavía tengo que encontrar buenos ejemplos con una solución funcional.Rails Paperclip & Multiple File Uploads

Ya tengo configuración imágenes múltiples,

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" 

En este momento estoy Viendo 5 file_fields individuales

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 

me gustaría tener

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

Eso permite al usuario selecciona múltiples archivos en su buscador de archivos. Pero, ¿cómo puedo procesar estos con un modelo anidado? Y haz que suban.

Respuesta

34

Así que hay algunos problemas aquí.

En primer lugar, el método has_attached_file de Paperclip no es una asociación a muchos archivos. Parece que estás intentando crear un "activo" como si fuera una asociación de Rails. Todo lo que hace Paperclip es poner un par de campos en su tabla para almacenar algunos metadatos sobre el archivo y usted obtiene un archivo adjunto por declaración de has_attached_file. Si desea adjuntar archivos 5, lo que tendría que hacer algo como:

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

o, alternativamente, se podría crear otro modelo sólo para almacenar los archivos. Por ejemplo:

class Listing < ActiveRecord::Base 
    has_many :assets 
end 

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

De esta manera, se pueden tener varias activos conectados a una lista (que no dijo lo que el objeto original fue así que simplemente lo llamó "lista").

En segundo lugar, no hay tal cosa como una carga múltiple de archivos en HTML (y, como tal, el método file_field no toma un argumento :multiple => true. Vas a tener que usar algo más allá de los carriles incorporados en el manejo de formulario si usted quiere subir archivos múltiples. Uploadify es una opción decente (que he usado antes). Hay una gema que transformará los campos de archivos para usar uploadify (y admitirá la sintaxis :multiple => true que desee): https://github.com/mateomurphy/uploadify_rails3/wiki. Sin embargo, no puedo dar fe de lo bueno que es.

Mi consejo sería comenzar paso a paso. Cargar a través de Flash a Rails puede ser un proceso complicado que implica lidiar con la metaetiqueta CSRF y otros campos en su formulario. Comience haciendo una forma que permita a un usuario cargue un archivo y almacénelo a través de Paperclip. Luego, tal vez rompa la declaración has_attached_file en otro modelo para que pueda tener 1 o muchos archivos asociados con un modelo (como se muestra en el bloque de código de modelo múltiple anterior). Luego intente agregar Uploadify u otra alternativa. Ernie Miller tiene un tutorial decente sobre la integración de Uploadify: http://erniemiller.org/2010/07/09/uploadify-and-rails-3/. Para iniciar, recuerde que has_attached_file solo puede adjuntar un archivo. Cuando intenta llamar al @listing.assets, no hay "activos". Hay un activo. Necesita crear un modelo por separado usted mismo y usar las asociaciones de Rails si quiere múltiples archivos.

+0

Ya tengo otro modelo creado llamado "Listado". Una lista tiene muchos activos. Ya puedo cargar múltiples activos, pero no a través de un solo campo "Elegir archivo". si alguien tiene buenos ejemplos usando uploadify eso sería genial. No estoy seguro de cómo hacer el fondo JS para procesar cada imagen y POSTALIZARlas al servidor correctamente. – kcollignon

+3

Puede agregar ': multiple =>" multiple "' a su 'file_field', que habilita la selección de múltiples archivos desde un campo de entrada de archivo html (al menos en Chrome). Todavía no he resuelto el problema de administrar estas cargas, pero sé que el parámetro de publicación incluye una matriz de los múltiples archivos que ha elegido y cargado. –

+0

Y también tiene que agregar ': html => {: multipart =>: true}' a su 'form_for'. –

2

La respuesta aceptada dice que no existe la carga de archivos múltiples en HTML.

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

Esto le permite seleccionar varias imágenes y enviarlas como una matriz.

Si tiene la relación Dog has_many Images y Image has_attachment :file, hacer esto para obtener múltiples imágenes para subir a la vez:

En su html.erb

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

En su controlador

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

En su modelo de perro

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

Esto supone que ya puede cargar una imagen pero desea actualizar a varias imágenes a la vez. Tenga en cuenta que el tiempo de espera aumentará.

Para ayudar a reducir el tiempo de espera, espíe mi post en esta pregunta relacionada con la carga de velocidad.

Cuestiones relacionadas