2010-12-03 48 views
0

J'ai actuellement un uploader de photos qui crée des images photo en utilisant des trombones et des gemmes aws-s3. Le chargeur peut également ajouter dynamiquement des champs de téléchargement de photos afin que plusieurs fichiers puissent être téléchargés en même temps sur un seul envoi. Ce que je voudrais faire est d'avoir la possibilité de télécharger un fichier zip en espérant que le fichier contienne des photos et qu'il fonctionne avec le même processus de création de vignettes, de taille moyenne et d'images originales que le téléchargement d'un seul fichier photo . Mon modèle et le contrôleur est assez simple avec le stockage de photos localement si sur le développement, ou sur s3 si la production, avec juste un peu sur fanciness avec le modèle de vue:Utilisation de Paperclip et d'Amazon S3 pour le fichier zip contenant des photos

photo.rb

class Photo < ActiveRecord::Base 
    belongs_to :album 
    if AppConfig['s3'] 
    has_attached_file :data, 
     :styles => { 
     :thumb => "100x100>", 
     :medium => "500x500>" 
     }, 
     :storage => :s3, 
     :default_style => :original, 
     :bucket => AppConfig['s3']['bucket_name'], 
     :s3_credentials => { :access_key_id => AppConfig['s3']['access_id'], :secret_access_key => AppConfig['s3']['secret_key'] }, 
     :s3_headers => { 'Cache-Control' => 'max-age=315576000', 'Expires' => 10.years.from_now.httpdate }, 
     :path => "/:class/:id/:style/:filename" 
    else 
    has_attached_file :data, 
     :styles => { 
     :thumb => "100x100>", 
     :medium => "500x500>" 
     }, 
     :storage => :filesystem, 
     :default_style => :original 
    end 
end 

* photos_controller.rb *

class Admin::PhotosController < Admin::AdminController 
    def index 
    @photos = Photo.all 
    end 

    def show 
    @photo = Photo.find(params[:id]) 
    end 

    def new 
    @photo = Photo.new 
    end 

    def create 
    @photo = Photo.new(params[:photo]) 
    if @photo.save 
     flash[:notice] = "Successfully created photo." 
     redirect_to [:admin, @photo] 
    else 
     render :action => 'new' 
    end 
    end 

    def edit 
    @photo = Photo.find(params[:id]) 
    end 

    def update 
    @photo = Photo.find(params[:id]) 
    album = @photo.album 
    if @photo.update_attributes(params[:photo]) 
     flash[:notice] = "Successfully updated photo." 
     redirect_to [:admin, @photo] 
    else 
     redirect_to edit_admin_album_url(album) 
    end 
    end 

    def destroy 
    @photo = Photo.find(params[:id]) 
    album = @photo.album 
    @photo.destroy 
    flash[:notice] = "Successfully destroyed photo." 
    redirect_to edit_admin_album_url(album) 
    end 

end 

les parties intéressantes de la vue sont ici:

* _fo rm.html.haml *

#photos 
    - if @album.new_record? 
     = render :partial => 'photo', :locals => { :form => f, :photo => @album.photos.build } 
    - else 
     - for photo in @album.photos 
     .photo 
      = link_to(image_tag(photo.data(:thumb)), photo.data(:medium), :class => 'photo_link') 
      - f.fields_for @album.photos do |photo_field| 
      /Viewable? 
      /= photo_field.check_box :viewable 
      %br 
      = link_to "Delete", [:admin, photo], :confirm => 'Are you sure?', :method => :delete 
     .float_clear 
    = add_object_link("New Photo", f, @album.photos.build, "photo", "#photos") 
    .row 
    = submit_tag "Save", :disable_with => "Uploading please wait..." 
    .float_clear 

* _photo.html.haml *

.photo_form 
    %p 
    - form.fields_for :photos, photo, :child_index => (photo.new_record? ? "index_to_replace_with_js" : nil) do |photo_form| 
    = photo_form.file_field :data 
    = link_to_function "delete", "remove_field($(this), ('.photo_form'))" 
    %br 

Bienvenue toutes les idées ou contributions! Merci!

Répondre

2

Je voudrais utiliser un rappel pour extraire les fichiers d'archive (zip, tar etc) et laisser les fichiers d'image continuer à être traités/sauvegardés. Utilisez delayed_job pour traiter les archives après le téléchargement pour augmenter l'expérience de l'utilisateur et faciliter la charge sur votre serveur. Je ne suis pas sûr des utilitaires d'archivage dans ruby ​​mais vous pouvez utiliser les appels système pour décompresser les archives en utilisant tar ou similaire, puis parcourir les fichiers décompressés pour traiter et stocker les images et ignorer les fichiers non-image.

Vous pouvez même utiliser une tâche rake et un travail cron pour décompresser, faire une boucle et créer des photos à partir des archives non-assistées.

+0

Merci pour la réponse Jon. J'ai l'application déployée sur heroku et préfère ne pas payer pour le processus de DJ et cron n'est disponible qu'une fois par jour. Je vais essayer de créer un seau s3 séparé pour les fichiers zip (archive) et les post-traiter avec un rappel. –

+0

Je peux comprendre ça, Chris. C'est certainement une façon de contourner cette pensée. Bonne chance! –