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

时间:2014-12-20 06:53:21

标签: ruby-on-rails ruby zip temporary-files

我想在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用于拉链?如果是的话,这里有什么问题?

2 个答案:

答案 0 :(得分:6)

所以它实际上看起来并不像你需要或想要一个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/

答案 1 :(得分:6)

在我的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