Paperclip es un excelente complemento de carga para Rails. El almacenamiento de las cargas en el sistema de archivos local o Amazon S3 parece funcionar bien. Simplemente asumiría que los archivos de la tienda en el localhost, pero el uso de S3 es necesario para esta aplicación, ya que se alojará en Heroku.Comprima todos los archivos adjuntos de Paperclip almacenados en S3
¿Cómo podría obtener todas mis cargas/archivos adjuntos de S3 en una sola descarga comprimida?
Obtener un archivo comprimido de archivos desde el sistema de archivos local parece sencillo. Es obtener los archivos de S3 que me tiene perplejo. Creo que puede tener algo que ver con la forma en que rubyzip maneja los archivos referenciados por URL. He intentado varios enfoques, pero parece que no puedo evitar errores.
format.zip {
registrations_with_attachments = Registration.find_by_sql('SELECT * FROM registrations WHERE abstract_file_name NOT LIKE ""')
headers['Cache-Control'] = 'no-cache'
tmp_filename = "#{RAILS_ROOT}/tmp/tmp_zip_" <<
Time.now.to_f.to_s <<
".zip"
# rubyzip gem version 0.9.1
# rdoc http://rubyzip.sourceforge.net/
Zip::ZipFile.open(tmp_filename, Zip::ZipFile::CREATE) do |zip|
#get all of the attachments
# attempt to get files stored on S3
# FAIL
registrations_with_attachments.each { |e| zip.add("abstracts/#{e.abstract.original_filename}", e.abstract.url(:original, false)) }
# => No such file or directory - http://s3.amazonaws.com/bucket/original/abstract.txt
# Should note that these files in S3 bucket are publicly accessible. No ACL.
# works with local storage. Thanks to Henrik Nyh
# registrations_with_attachments.each { |e| zip.add("abstracts/#{e.abstract.original_filename}", e.abstract.path(:original)) }
end
send_data(File.open(tmp_filename, "rb+").read, :type => 'application/zip', :disposition => 'attachment', :filename => tmp_filename.to_s)
File.delete tmp_filename
}
Se pregunta si la solución es usar la gema AWS-S3 para obtener todos los archivos en el cubo y no usar clip? – chaserx
Es casi seguro que desea usar to_file() en lugar de url(). – vladr
Sí. Yo también pensé en eso. Da este error no se puede convertir Paperclip :: Tempfile en String – chaserx