На молнии все вложения Скрепки сохранены на S3

Скрепка является большим плагином загрузки для направляющих. Хранение загрузок в локальной файловой системе или Amazon S3, кажется, работает хорошо. Я просто принял бы, хранят файлы на localhost, но использование S3 требуется для этого приложения, поскольку это будет размещено на Heroku.

Как я пошел бы о получении всех моих загрузок/вложений от S3 в единственной заархивированной загрузке?

Получение zip файлов от локальной файловой системы кажется прямым. Это получает файлы от S3, который имеет меня озадаченный. Я думаю, что это может иметь некоторое отношение к способу, которым rubyzip обрабатывает файлы, на которые ссылается URL. Я попробовал различные подходы, но, может казаться, не избегаю ошибок.

    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
          }
15
задан chaserx 26 February 2010 в 13:19
поделиться

1 ответ

Вы почти наверняка хотите использовать e.abstract.to_file.path вместо e.abstract.url(...).

См:

UPDATE

Из changelog:

Новое в 3.0.1:

  • ИЗМЕНЕНИЕ API: #to_file был удален. Вместо него используйте метод #copy_to_local_file .
11
ответ дан 1 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: