【问题标题】:Using Tempfile to create a zip file in rails使用 Tempfile 在 Rails 中创建一个 zip 文件
【发布时间】:2014-12-20 06:53:21
【问题描述】:

我想在 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 进行压缩?如果是,这里有什么问题?

【问题讨论】:

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


    【解决方案1】:

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

        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,但这是一个更好的解决我的问题的方法。谢谢+1
    • 祝你好运...我最初是在delayed_job 中删除临时文件...哦,太恐怖了。那时我决定打开 gem 并在缓冲区中做所有事情。
    • @AdityaShedge 这在 Heroku 上是否实用,因为 dyno 的内存非常有限?
    • @Mohamad 取决于您的 zip 文件可以有多大。就我而言,我知道它不会超过几 Mb ......我可以忍受,因为在磁盘上写入文件并稍后清理它更麻烦。如果您的文件大小超过内存大小的 1/4,则可能是个问题。
    • @AdityaShedge 谢谢。具体来说,这会在 RAM 中构建文件,然后将其发送给用户。它不会即时流式传输文件,对吗?因为它必须先完成文件的构建,然后才能将其作为响应发送。
    【解决方案2】:

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

    【讨论】:

    • 我能够完成您的建议。然而,这不是我的目标。我想使用临时文件,因为这是我的代码中的临时操作。我将在再执行一步后删除该文件。虽然它也可以按照您建议的方式完成,但我专门为此目的寻找临时文件。谢谢
    猜你喜欢
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    相关资源
    最近更新 更多