Использование Paperclip и Amazon S3 для zip-файла, содержащего фотографии - PullRequest
0 голосов
/ 03 декабря 2010

В настоящее время у меня есть работающий загрузчик фотографий, который создает фотоизображения с использованием скрепок и драгоценных камней aws-s3. Загрузчик также может динамически добавлять поля загрузки фотографий, чтобы одновременно можно было загружать несколько файлов за одну отправку. То, что я хотел бы сделать, это иметь возможность загрузки zip-файла, ожидая, что файл содержит фотографии, и он будет проходить через тот же процесс создания миниатюр, среднего размера и исходных изображений, которые проходит загрузка одного файла фотографии , Моя модель и контроллер довольно просты с локальным хранением фотографий, если они находятся в разработке, или на 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

Интересные части вида здесь:

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

Приветствую всех идей или вкладов! Спасибо!

1 Ответ

2 голосов
/ 04 декабря 2010

Я бы использовал обратный вызов, чтобы извлечь архивные файлы (zip, tar и т. Д.) И позволить файлам изображений обрабатываться / сохраняться.Используйте delayed_job для обработки архивов после загрузки, чтобы повысить удобство работы с пользователем и облегчить загрузку вашего сервера.

Я не уверен в каких-либо утилитах архивирования в ruby, но вы можете использовать системные вызовы, чтобы разархивировать архивы с использованием tar или чего-то подобного, а затем перебрать разархивированные файлы, чтобы обработать и сохранить изображения и удалить не изображенияфайлы.

Вы можете даже использовать задачу rake и задание cron, чтобы периодически разархивировать, перебирать и создавать фотографии из архивов без потерь.

...