Ruby on rails 使用rails创建多个csv文件并下载一个zip归档文件

Ruby on rails 使用rails创建多个csv文件并下载一个zip归档文件,ruby-on-rails,csv,rubyzip,Ruby On Rails,Csv,Rubyzip,我正在寻找一种方法来创建多个csv文件,并在我的rails应用程序中的一个请求内将它们作为一个zip存档下载 为了构建归档文件,我使用rubyzip gem——只需下载rails内置的函数send_data。我的问题是rubyzip的add函数需要一个路径名来加载文件。但是没有路径,因为我的csv文件是在同一个请求中创建的 一些代码: # controller action to download zip def download_zip zip = @company.download_al

我正在寻找一种方法来创建多个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) }

有关get_output_stream的更多详细信息,请参阅-您还可以传递其他参数以指定要创建的文件的属性。

get_output_stream
对我不起作用。但是,更新的方法
Zip::OutputStream.write\u buffer
会有所帮助


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

这似乎就是我要寻找的方法!但是仍然缺少一些东西:打开myarchive.zip会创建一个名为myarchive.zip.cpgz的新文件。创建归档文件是否仍然有问题,或者这可能是我的mac存在的另一个问题?是否尝试指定mime类型
send_data zip,文件名:“abc.zip”,键入:“application/zip”
-许多浏览器/操作系统只会正确处理存在的文件。是的,我指定了mime类型。我不小心用编辑打开了abc.zip。事实证明,它包含数组中的所有用户条目,而不是我要为每个用户构建的实际csv文件。为用户下载csv确实有效,因为我在其他地方使用它为特定用户提供csv下载。这个街区少了什么东西吗?可能是另一种类型规范?这是因为您将下载的结果分配给zip变量。download_all的结果是用户数组,因为这是该方法中的最后一条语句。send_data的第一个参数应该是zip文件的内容。您应该检查tmpdir库,以创建一个适当的路径来存储zip文件(而不仅仅是“abc.zip”,它是相对于您的app dir的)。然后阅读该文件并将其内容传递给send_data。找到一篇关于如何使用tempfiles处理zip文件的博客文章:感谢您的帮助!