2010-12-03 13 views
0

Ich habe derzeit eine funktionierende Foto-Uploader, die Fotobilder mit Büroklammer und aws-s3 Edelsteine ​​erstellt. Der Loader kann auch Foto-Upload-Felder dynamisch hinzufügen, sodass mehrere Dateien gleichzeitig bei einem einzigen Upload hochgeladen werden können. Ich möchte die Möglichkeit haben, eine Zip-Datei mit der Erwartung hochzuladen, dass die Datei Fotos enthält, und dass ich denselben Prozess zum Erstellen von Miniaturansichten, mittelgroßen Bildern und Originalbildern ausführen muss, den der Upload der einzelnen Fotodateien durchläuft . Mein Modell und Controller sind ziemlich geradlinig mit Fotos vor Ort, wenn auf Entwicklung zu speichern, oder auf s3, wenn die Produktion, mit nur ein wenig auf fanciness mit der Ansicht Vorlage:Verwenden von Paperclip und Amazon S3 für zip-Datei mit Fotos

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 

die interessanten Teile der Ansicht sind hier:

* _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 

Willkommen alle Ideen oder Beiträge! Vielen Dank!

Antwort

2

Ich würde einen Callback verwenden, um die Archivdateien (zip, tar usw.) herauszuziehen und die Bilddateien zur Verarbeitung/Speicherung durchgehen zu lassen. Verwenden Sie delayed_job, um die Archive nach dem Upload zu verarbeiten, um die Benutzerfreundlichkeit zu erhöhen und die Belastung Ihres Servers zu verringern.

Ich bin mir nicht sicher, irgendwelche Archiv-Dienstprogramm Wrapper in Ruby, aber Sie könnten Systemaufrufe zum Entpacken von Archiven mit tar oder etwas ähnliches, dann durchlaufen Sie die entpackten Dateien, um die Bilder zu verarbeiten und zu speichern und Nicht-Image-Dateien zu verwerfen.

Sie könnten sogar einen Rake-Task und einen Cron-Job verwenden, um regelmäßig Fotos aus den nicht archivierten Archiven zu entpacken, durchzuschleifen und zu erstellen.

+0

Danke für die Antwort Jon. Ich habe die App auf Heroku installiert und möchte lieber nicht für den DJ-Prozess bezahlen und cron ist nur einmal am Tag verfügbar. Ich werde versuchen, einen separaten s3-Bucket für zip (Archiv) -Dateien zu erstellen und diese mit einem Callback zu bearbeiten. –

+0

Ich kann das gut Chris verstehen. Das ist definitiv eine Möglichkeit, diesen Gedanken zu umgehen. Viel Glück! –