我正在寻找一种方法来创建多个csv文件,并在我的rails应用程序中的一个请求中将它们下载为一个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()?
周末好人,编码愉快!
答案 0 :(得分:2)
您可以将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 - 您还可以传递其他参数以指定要创建的文件的属性。
答案 1 :(得分:1)
get_output_stream
对我不起作用。但是,更新后的方法Zip::OutputStream.write_buffer
有助于
https://gist.github.com/aquajach/7fde54aa9bc1ac03740feb154e53eb7d
该示例还为文件添加了密码保护。