创建多个csv文件,并使用rails在一个zip档案中下载所有文件



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

为了构建归档文件,我使用rubyzip-gem——只下载rails内置的函数send_data。我遇到的问题是,rubyzip的add函数需要一个加载文件的路径名。但是没有路径,因为我的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) }

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新