Ruby on rails 使用Tempfile在rails中创建zip文件

Ruby on rails 使用Tempfile在rails中创建zip文件,ruby-on-rails,ruby,zip,temporary-files,Ruby On Rails,Ruby,Zip,Temporary Files,我想在rails中创建一个临时的.zip文件。为了创建zip文件,我使用了rubyzipgem 目前我正在这样做: 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:

我想在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
用于zip?如果是,这里出了什么问题?

因此看起来您实际上并不需要或想要临时文件。您确实需要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执行此操作的讨论-

在我的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,因为这是代码中的临时操作。我将在执行更多步骤后删除该文件。虽然它可以做你建议的方式太多,但它我特别为这个目的寻找tempfile。谢谢,尽管您仍然没有使用
TempFile
,但这是解决我问题的更好方法。谢谢+1祝你好运…我最初是在延迟工作中删除临时文件的…哦,太恐怖了。就在那时,我决定打开gem,在缓冲区中做所有事情。@AdityaShedge这对Heroku是否可行,因为dynos的内存非常有限?@Mohamad取决于zip文件的大小。在我的情况下,我知道它不会超过几Mb…这是我可以忍受的,因为在磁盘上写一个文件并在以后清理它要麻烦得多。如果您的文件大小超过内存大小的1/4,则可能是个问题。@AdityaShedge谢谢。具体来说,这将在RAM中构建文件,然后将其发送给用户。它不会动态地传输文件,对吗?因为它必须先完成文件的构建,然后才能将其作为响应发送。