"在开放写作时无法打开阅读条目"同时创建一个zip文件

时间:2017-05-07 00:17:35

标签: ruby-on-rails zip

我试图创建一个可以下载包含文件的zip的函数。我跟着this tutorial,如果您要下载CSV(我翻译了评论),我的代码应该如下所示:

def exporter_zip
    # CSV's header
    csv = "Title;Content;Publishing date;File name;\n" 
    # Loop over articles saved in database
    Article.all.each do |article|
      # Creating the CSV with datas
      csv += "#{article.title};#{article.content};#{article.publishing_date.strftime("%Y-%m-%d") if article.publishing_date };#{article.file_name}\n"
    end

    # Creating the zip file inside the folder
    zip_tmp = File.new("#{Rails.root}/db/mon_fichier.zip",  "w+")

    # opening the file in writing mode
    Zip::File.open(zip_tmp.path, Zip::File::CREATE) {
      |zipfile|

     # Inserting the csv variable's content inside the article.csv file, which is inserted into the zip file

      zipfile.get_output_stream("articles.csv") { |f| f.puts csv }
    }

    # Sending the created file
    send_file "#{Rails.root}/db/mon_fichier.zip"
  end

以下是我如何调整代码:

class DownloadController < ApplicationController
  require 'zip'

  def zip
    # Creating zip file
    zip_tmp = File.new("#{Rails.root}/public/zip-#{Time.now.strftime('%d-%m-%Y')}.zip", 'w+')
    FileDetail.all.each do |fichier|
      Zip::File.open(zip_tmp.path, Zip::File::CREATE) { |zipfile|
        # fichier.filename => file.mp3
        # fichier.path => path/to/file.mp3
        zipfile.get_output_stream(fichier.filename, fichier.path)
      }
    end

    send_file "#{Rails.root}/public/zip-#{Date.today.to_time}.zip"
  end
end

但是,虽然我甚至不确定我是否正确执行此操作,但我收到以下错误:cannot open entry for reading while its open for writing,定位以下行:Zip::File.open(zip_tmp.path, Zip::File::CREATE) { |zipfile|

任何人都可以告诉我发生了什么事吗?我从来没有这样做过,所以我不知道出了什么问题......

提前谢谢

1 个答案:

答案 0 :(得分:1)

FileDetail.all.each do |fichier|
  Zip::File.open(zip_tmp.path, Zip::File::CREATE) { |zipfile|
    # fichier.filename => file.mp3
    # fichier.path => path/to/file.mp3
    zipfile.get_output_stream(fichier.filename, fichier.path)
  }
end

这样做会尝试为FileDetail的每个成员创建zip文件。您应该将其编码为仅打开并创建一次:

Zip::File.open(zip_tmp.path, Zip::File::CREATE) do |zipfile|
  FileDetail.all.each do |fichier|
    # fichier.filename => file.mp3
    # fichier.path => path/to/file.mp3
    zipfile.get_output_stream(fichier.filename, fichier.path)
  end
end