9

我正在寻找一种方法来创建多个 csv 文件并将它们作为一个 zip 存档在我的 rails 应用程序的一个请求中下载。

要构建存档,我使用 ruby​​zip gem - 只需使用 rails 内置函数 send_data 即可下载它。我遇到的问题是 ruby​​zip 的 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()?

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

4

2 回答 2

5

您可以将 CSV 输出写入临时文件并在其上调用 zipfile.add(),但有一个更简洁的解决方案:

zipfile.get_output_stream("#{user.name}.csv") { |f| f.puts(user.to_csv) }

有关 get_output_stream 的更多详细信息,请参阅http://rdoc.info/github/rubyzip/rubyzip/master/Zip/File#get_output_stream-instance_method - 您还可以传递其他参数来指定要创建的文件的属性。

于 2014-09-13T15:40:44.867 回答
4

get_output_stream对我不起作用。但是,更新的方法Zip::OutputStream.write_buffer有助于

https://gist.github.com/aquajach/7fde54aa9bc1ac03740feb154e53eb7d

该示例还为文件添加了密码保护。

于 2016-04-22T08:34:34.827 回答