Kẹp giấy là một plugin tải lên tuyệt vời cho Rails. Lưu trữ video tải lên trên hệ thống tệp cục bộ hoặc Amazon S3 dường như hoạt động tốt. Tôi chỉ giả sử lưu trữ các tập tin trên localhost, nhưng việc sử dụng S3 là cần thiết cho ứng dụng này vì nó sẽ được lưu trữ trên Heroku.Nén tất cả các tệp đính kèm Kẹp giấy được lưu trữ trên S3
Tôi làm cách nào để tải tất cả các tệp tải lên/tệp đính kèm của tôi từ S3 trong một lần tải xuống được nén?
Lấy một tệp zip từ hệ thống tệp cục bộ có vẻ thẳng về phía trước. Nó nhận được các tập tin từ S3 khiến tôi bối rối. Tôi nghĩ rằng nó có thể có một cái gì đó để làm với cách rubyzip xử lý các tập tin được tham chiếu bởi URL. Tôi đã thử các cách tiếp cận khác nhau nhưng dường như không tránh được lỗi.
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
}
Tự hỏi nếu giải pháp ở đây là sử dụng đá quý AWS-S3 để nhận tất cả các tệp trong thùng và không sử dụng kẹp giấy? – chaserx
Bạn gần như chắc chắn muốn sử dụng to_file() thay vì url(). – vladr
Vâng. Tôi cũng vậy. Cung cấp lỗi này. không thể chuyển đổi Paperclip :: Tempfile thành String – chaserx