我想在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文件大小确实对我有意义,但我遇到了这个问题。有什么想法吗?谢谢!
答案 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