2017-10-15 2 views
1

Ich baue eine App zum Verwalten von Abonnements und Erstellen von Mailinglisten.Senden einer Zip-Datei mit Sinatras Anhangsmethode funktioniert nicht

Ich baue eine Funktion in meiner App, um alle Mailinglisten unter jedem Abonnement als mehrere CSVs zu exportieren. Dies erzeugt eine Zip-Datei mit all den verschiedenen CSVs darin. Dann benutze ich die Anhangsmethode in Sinatra, um die Datei an den Benutzer zu senden.

Immer wenn ich dies tue, erhält der Benutzer eine Zip-Datei, die kleiner als 1 KB ist ohne die Daten - aber wenn ich auf die Dateien auf dem Server schaue, ist die Zip-Datei da und es hat alle Daten drin.

Eine Idee, warum der Anhang, den der Benutzer herunterlädt, keine Daten hat?

-Code benutzen ich zu erstellen und die Zip-Datei an den Benutzer senden:

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 

Vielen Dank im Voraus!

Antwort

1

So fand ich heraus, dass Sinatra eine andere Methode namens send_file hat, die in diesem Fall besser als die attachment Methode funktioniert.

Verwenden send_file anstelle von attachment funktioniert gut.

Verwandte Themen