我正在寻找一种方法来创建多个 csv 文件,并在 Rails 应用程序的一个请求中将它们作为一个 zip 存档下载。
为了构建存档,我使用 rubyzip gem - 只需使用 Rails 内置函数 send_data 即可下载它。我遇到的问题是 rubyzip 的添加功能需要一个路径名来加载文件。但没有路径,因为我的 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()?
大家周末愉快,编码愉快!
您可以将 CSV 输出写入临时文件并调用 zipfile.add() ,但有一个更干净的解决方案:
zipfile.get_output_stream("#{user.name}.csv") { |f| f.puts(user.to_csv) }
See http://rdoc.info/github/rubyzip/rubyzip/master/Zip/File#get_output_stream-instance_method http://rdoc.info/github/rubyzip/rubyzip/master/Zip/File#get_output_stream-instance_method有关 get_output_stream 的更多详细信息 - 您还可以传递其他参数来指定要创建的文件的属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)