Rails 3:压缩后无法解压缩zip

时间:2013-01-29 18:45:24

标签: ruby-on-rails-3

我想在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文件,但是当我尝试打开它时,Archive Manager(Mac OS X)开始取消归档它,但一直这样做而不会完成。我相信我的代码中缺少一些东西。 zip文件大小确实对我有意义,但我遇到了这个问题。有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分: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