1

如果您让 Paperclip + AWS S3 在您的 rails 3 应用程序中工作,并且您想要压缩与模型相关的附件,如何继续?

4

1 回答 1

4

注意: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 损坏?
io_adapters.for(object.attachment).path 随机失败

于 2012-12-18T15:05:18.773 回答