2017-10-15 123 views
1

我正在構建一個管理訂閱和生成郵件列表的應用程序。發送帶Sinatra附件方法不起作用的zip文件

我在我的應用程序中構建了一個功能,將每個訂閱下的所有郵件列表導出爲多個csv。這會生成一個包含所有csv的zip文件。然後,我使用Sinatra中的附件方法將文件發送給用戶。

但是,每當我這樣做時,用戶都會得到一個小於1KB的zip文件,但沒有任何數據 - 但是當我查看服務器上的文件時,zip文件就在那裏,它包含所有數據在裏面。

任何想法爲什麼用戶下載的附件沒有任何數據?

代碼我用來創建和zip文件發送給用戶:

require 'zip' 

get '/all' do 
    zip_name = 'all_mailing_lists.zip' 
    File.delete(zip_name) if File.exists?(zip_name) # Delete previous version if it exists 

    # Get a list of all csv files alrady created and delete them 
    Dir.glob("./exports/*.csv") do |filepath| 
     File.delete(filepath) if File.exists?(filepath) 
    end 

    subscriptions = Subscription.all # Get all subscriptions into an array 

    # Iterate through all subscriptions and export to csv 
    subscriptions.each do |subscription| 
     export = ExportCsv.new 

     mailing_list = export.export_mailing_list(subscription) 

     # Create the csv 
     File.open("./exports/#{subscription.name}_mailing_list.csv", 'w+') do |file| 
      file << mailing_list.to_s 
     end 
    end 

    # Zip all csv files 
    Zip::File.open(zip_name, Zip::File::CREATE) do |zipfile| 
     # Find all .csv files in the exports directory 
     Dir.glob("./exports/*.csv") do |filepath| 
      filename = filepath.split("/").pop 
      zipfile.add(filename, filepath) 
     end 
    end 

    # Download zip file 
    attachment("./all_mailing_lists.zip") 
    File.read("./all_mailing_lists.zip") 
end 

提前感謝!

回答

1

因此,我發現Sinatra有一個不同的方法,稱爲send_file,在這種情況下,它比attachment方法更好。使用send_file而不是attachment工作得很好。