使用Tempfile在rails中创建一个zip文件

我想在rails中创建一个临时的.zip。 为了创建zip文件我使用rubyzip gem。

目前我这样做:

 zfname = Tempfile.new(['somename','.zip'], Rails.root.to_s + '/tmp/') Zip::ZipFile.open(zfname.path, Zip::ZipFile::CREATE) do |zipfile| zipfile.add(file, basepath + file) end 

这会产生以下错误:

 Zip::ZipError: Zip end of central directory signature not found 

是否可以使用Tempfile进行拉链? 如果是的话,这里有什么问题?

在我的rails应用程序中,当我需要向用户发送zip文件时,我只是将它们存储在缓冲区中并在控制器中使用“发送数据”方法。 我最初尝试使用’Tempfile’,但它有一个额外的任务,删除zip文件后发送给用户这是一个痛苦。 这是你要找的东西吗?

  Zip::OutputStream.write_buffer do |stream| file_paths.each_with_index do |file_path, index| # rename the pdf stream.put_next_entry("#{name}-#{index + 1}.pdf") # add pdf to zip stream.write IO.read(file_path) end end 

所以它实际上看起来并不像你需要或想要一个Tempfile。 你真的想在Rails.root / tmp目录中有一个随机路径。 尝试这样的事情:

 zfpath = Rails.root.join('tmp', "somename-#{SecureRandom.hex(8)}.zip" Zip::ZipFile.open(zfpath, Zip::ZipFile::CREATE) do |zipfile| zipfile.add(file, basepath + file) end 

更新:

虽然它要复杂得多,但你可以在这里找到关于如何使用Tempfile进行讨论的讨论 – http://thinkingeek.com/2013/11/15/create-temporary-zip-file-send-response-rails/