Packen Sie alle in S3 gespeicherten Büroklammer-Anhänge zu

Paperclip ist ein großartiges Upload-Plugin für Rails. Das Speichern von Uploads im lokalen Dateisystem oder in Amazon S3 scheint gut zu funktionieren. Ich würde einfach davon ausgehen, dass sich Speicherdateien auf dem localhost befinden, aber für diese App ist die Verwendung von S3 erforderlich, da sie auf Heroku gehostet wird.

Wie würde ich vorgehen, um alle meine Uploads / Anhänge von S3 in einem einzigen gezippten Download abzurufen?

Holen Sie sich eine Zip-Datei von derlokales Dateisystem scheint einfach zu sein. Es hat mich verwirrt, die Dateien von S3 zu bekommen. Ich denke, es kann etwas damit zu tun haben, wie Rubyzip mit Dateien umgeht, auf die per URL verwiesen wird. Ich habe verschiedene Ansätze ausprobiert, kann aber Fehler nicht vermeiden.

    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
          }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage