【问题标题】:Creating multiple csv-files and download all in one zip-archive using rails使用 rails 创建多个 csv 文件并在一个 zip 存档中下载所有内容
【发布时间】:2014-11-07 14:03:31
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails csv rubyzip


    【解决方案1】:

    您可以将 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 - 您还可以传递其他参数来指定要创建的文件的属性。

    【讨论】:

    • 这似乎是我正在寻找的方法!但是仍然缺少一些东西:打开 myarchive.zip 会创建一个名为 myarchive.zip.cpgz 的新文件创建存档时仍然有问题还是我的 mac 可能存在另一个问题?
    • 您是否尝试过指定 MIME 类型? send_data zip, filename: "abc.zip", type: 'application/zip' - 许多浏览器/操作系统只有在文件存在时才会正确处理该文件。
    • 是的,我指定了 mime 类型。我不小心用我的编辑器打开了 abc.zip。原来它包含数组中的所有用户条目,而不是我想为每个用户构建的实际 csv 文件。用户的 to_csv 确实有效,因为我在其他地方使用它为特定用户提供 csv 下载。 puts 块中是否缺少某些内容?也许是另一种类型规范?
    • 那是因为您将 download_all 的结果分配给 zip 变量。 download_all 的结果是用户数组,因为这是该方法中的最后一条语句。 send_data 的第一个参数应该是 zip 文件的内容。您应该查看 tmpdir 库以创建一个正确的路径来存储您的 zip 文件(不仅仅是“abc.zip”,它与您的应用程序目录相关)。然后读取该文件并将其内容传递给 send_data。
    • 找到一篇关于如何使用临时文件处理 zip 文件的博文:thinkingeek.com/2013/11/15/… 感谢您的帮助!
    【解决方案2】:

    get_output_stream 不适合我。但是,更新的方法Zip::OutputStream.write_buffer 有帮助

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      相关资源
      最近更新 更多