使用Rails创建多个CSV文件并将所有文件打包成一个zip归档文件下载

10

我正在寻找一种方法,在我的Rails应用程序中,通过一个请求创建多个CSV文件并将它们作为一个zip压缩包下载。

为了创建这个压缩包,我使用了rubyzip gem - 为了下载它,我只需要使用Rails内置的send_data函数。但是我的问题是,rubyzip的add-function需要一个路径名来加载文件。但是,由于我的CSV文件是在同一个请求中创建的,因此没有路径可用。

一些代码:

# controller action to download zip
def download_zip
  zip = @company.download_all
  send_data zip, filename: "abc.zip", type: 'application/zip'
end

# method to create zip
def download_all
  Zip::File.open('def.zip', Zip::File::CREATE) do |zipfile|
    self.users.each do |user|
      #some magic to combine zipfile.add() and user.to_csv
    end
  end
end

# method to create csv
def to_csv
  CSV.generate do |csv|
    #build awesome csv
  end
end

有没有一种方法可以将我的CSV文件临时保存在某个目录中,以便我可以将路径名传递给zipfile.add()函数?

祝大家周末愉快,编码愉快!

2个回答

5

看起来这就是我正在寻找的方法!但仍然有些问题:打开myarchive.zip会创建一个名为myarchive.zip.cpgz的新文件,创建存档时是否仍有问题或者这可能是我的Mac的另一个问题? - floriansuchan
你尝试过指定 MIME 类型吗?send_data zip, filename: "abc.zip", type: 'application/zip' - 如果该类型存在,许多浏览器/操作系统将只正确处理该文件。 - Jonas Witt
是的,我指定了MIME类型。我不小心用编辑器打开了abc.zip。结果发现它包含了所有用户条目的数组,而不是我想为每个用户构建的实际CSV文件。对于用户的to_csv确实有效,因为我在其他地方使用它为特定用户提供CSV下载。puts块中是否缺少某些内容?也许需要另一种类型的规范? - floriansuchan
好的,我认为我们现在已经非常接近了:正如您所看到的,我将“下载全部”中的目录更改为“def.zip”。该请求会在我的应用程序目录中创建该目录。正确解压缩后,其中包含所有的 CSV 文件。但是为什么它会被创建在我的应用程序目录中,而我下载的那个文件却无法使用呢? - floriansuchan
1
找到一篇关于如何处理带有临时文件的zip文件的博客文章:http://thinkingeek.com/2013/11/15/create-temporary-zip-file-send-response-rails/。感谢您的帮助! - floriansuchan
显示剩余2条评论

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接