2010-12-03 11 views
0

私は現在、paperclipとaws-s3の宝石を使用して写真イメージを作成する作業写真アップローダを持っています。ローダは、写真のアップロードフィールドを動的に追加することもできるため、1回の送信で複数のファイルを一度にアップロードすることができます。私がしたいのは、そのファイルに写真が含まれているとの期待を持ってzipファイルをアップロードし、サムネイル、中サイズ、および単一の写真ファイルのアップロードが行われる元の画像を作成する同じプロセスを実行するオプションがあることです。私のモデルとコントローラはかなりまっすぐ進む生産場合、ビューテンプレートを使用して装飾性に少しだけで、開発の場合、またはS3上でローカルに写真を保存している:写真を含むzipファイル用のPaperclipとAmazon S3を使用

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 

ビューの興味深い部分現在地:

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

すべてのアイデアや貢献を歓迎!ありがとう!

答えて

2

私は、アーカイブファイル(zip、tarなど)を取り出し、画像ファイルを処理/保存するためにコールバックを使用します。アップロード後にアーカイブを処理するためにdelayed_jobを使用すると、ユーザーエクスペリエンスが向上し、サーバーの負荷が軽減されます。

Rubyのアーカイブユーティリティラッパーについてはわかりませんが、システムコールを使ってtarなどのアーカイブを解凍し、解凍したファイルをループ処理して画像を処理して保存し、非画像ファイルを破棄することができます。

rakeタスクとcronジョブを使用して、アンアールしたアーカイブからPhotosを定期的に解凍し、ループスルーして作成することもできます。

+0

回答ありがとうございました。私はherokuに展開されたアプリを持っていて、DJプロセスの代金をむしろ支払うつもりはなく、cronは1日1回しか利用できません。 zip(アーカイブ)ファイル用に別々のs3バケットを作成し、コールバックでそれらを処理するようにします。 –

+0

私はそれが正しいクリスを理解することができます。それは確かにその考えを回避するための一つの方法です。運が良かった! –

関連する問題