Скрепка + массивная молния S3

Если у вас есть Paperclip + AWS S3, работающий в вашем приложении rails 3, и вы хотите заархивировать вложения, связанные с моделью, как действовать?


person David Mauricio    schedule 18.12.2012    source источник


Ответы (1)


Примечание. Некоторые вопросы в stackoverflow устарели, некоторые методы скрепки пропали.

Допустим, у нас есть Пользователь, и он :has_many => user_attachments

GC.disable
@user = User.find(params[:user_id])
zip_filename = "User attachments - #{@user.id}.zip" # the file name
tmp_filename = "#{Rails.root}/tmp/#{zip_filename}" # the path
Zip::ZipFile.open(tmp_filename, Zip::ZipFile::CREATE) do |zip|
  @user.user_attachments.each { |e| 
    attachment = Paperclip.io_adapters.for(e.attachment) #has_attached_file :attachment (,...)
    zip.add("#{e.attachment.original_filename}", attachment.path)
  }
end
send_data(File.open(tmp_filename, "rb+").read, :type => 'application/zip', :disposition => 'attachment', :filename => zip_filename)
File.delete tmp_filename
GC.enable
GC.start

Хитрость заключается в том, чтобы отключить GC, чтобы избежать исключения Errno::ENOENT. GC удалит загруженное вложение с S3, прежде чем оно будет заархивировано.

Источники:
to_file не работает в master?
io_adapters.for(object.attachment).path случайно не работает

person David Mauricio    schedule 18.12.2012