2017-10-15 121 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工作得很好。