2017-10-15 6 views
1

Je construis une application pour gérer les abonnements et générer des listes de diffusion.Envoyer un fichier zip avec la méthode de rattachement de Sinatra ne fonctionne pas

Je suis en train de créer une fonctionnalité dans mon application pour exporter toutes les listes de diffusion sous chaque abonnement en tant que plusieurs csv. Cela génère un fichier zip avec tous les différents csv à l'intérieur. Ensuite, j'utilise la méthode de rattachement dans Sinatra pour envoyer le fichier à l'utilisateur.

Cependant, chaque fois que je fais cela, l'utilisateur obtient un fichier zip qui est inférieur à 1 Ko sans aucune des données - mais quand je regarde les fichiers sur le serveur, le fichier zip est là et il a toutes les données dedans.

Une idée de pourquoi la pièce jointe que l'utilisateur télécharge n'a aucune donnée?

Code I utilisé pour créer et envoyer le fichier zip pour les utilisateurs:

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 

Merci à l'avance!

Répondre

1

Donc, j'ai découvert que Sinatra a une méthode différente appelée send_file qui fonctionne mieux que la méthode attachment dans ce cas. L'utilisation de send_file au lieu de attachment fonctionne très bien.