1

我想在 Ruby on Rails 中压缩一些文件并将 zip 文件保存在 tmp 文件夹中。我有一个 Document 模型,它有一个带有关联上传者的名称字段。我还使用 Carrierwave 将文件上传到 Amazon S3。我有以下代码:

class Document < ActiveRecord::Base

  mount_uploader :name, DocumentUploader
  ...

end


def create_zip  
  documents = Document.all
  folder = "#{Rails.root}/tmp"
  tmp_filename = "#{folder}/export.zip"

  zip_path = tmp_filename
  Zip::ZipFile::open(zip_path, true) do |zipfile|
    documents.each do |photo|
      zipfile.get_output_stream(document.name.identifier) do |io|
        io.write document.name.file.read
      end
    end
  end

end

这会在我的 tmp 文件夹中创建一个 export.zip 文件,但是当我尝试打开它时,存档管理器 (Mac OS X) 开始取消存档它,但一直在这样做而没有完成。我相信我的代码中缺少一些东西。zip 文件的大小对我来说确实有意义,但我遇到了这个问题。有什么想法吗?谢谢!

4

1 回答 1

0

实际上,我发现我可以使用其他程序(zipeg)打开 zip 文件。但是,只有文档数组中的最后一个文件在压缩文件中。我相信我一直在覆盖以前的文件,因为在所有情况下,唯一剩下的文件都被称为相同的(导出,作为 zip 本身的名称)。

下面的代码对我有用:

def create_zip
  documents = Document.all

  folder = "#{Rails.root}/tmp"
  tmp_filename = "#{folder}/export.zip"
  zip_path = tmp_filename

  Zip::ZipOutputStream.open(zip_path) do |zos|
    documents.each do |document|
      path = document.name_identifier
      zos.put_next_entry(path)
      zos.write photo.name.file.read
    end
  end
end
于 2013-01-31T21:34:19.887 回答