2014-09-13 55 views
3

我正在尋找一種方法來創建多個csv文件,並將它們作爲一個zip壓縮文件下載到我的Rails應用程序中的一個請求中。使用rails創建多個csv文件並將所有zip壓縮文件全部下載

要構建存檔我使用rubyzip gem - 下載它只是內置函數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 

有沒有辦法來temporarely救我的CSV文件,在某些目錄,我可以通過一個路徑名zipfile.add()?

週末愉快的人和愉快的編碼!

回答

2

你既可以寫你的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 - 你也可以傳遞額外的參數來指定要創建的文件的屬性。

+0

這似乎是我正在尋找的方法!但仍然缺少一些東西:打開myarchive.zip會創建一個名爲myarchive.zip.cpgz的新文件。創建存檔還是有問題,或者可能是我的mac中有另一個問題? – cashflo 2014-09-13 16:27:04

+0

你有沒有試過指定MIME類型? 'send_data zip,文件名:「abc.zip」,類型:'application/zip'' - 許多瀏覽器/操作系統只會在文件存在的情況下正確處理文件。 – 2014-09-13 17:09:14

+0

是的,我指定了MIME類型。我偶然用編輯器打開了abc.zip。事實證明它包含數組中的所有用戶條目,而不是我想要爲每個用戶構建的實際csv文件。 to_csv爲用戶確實工作,因爲我用它在別的地方爲特定用戶提供csv下載。 puts塊中有什麼缺失?也許另一種類型規格? – cashflo 2014-09-13 17:58:20