使用Sinatra的附件方法发送zip文件不起作用

时间:2017-10-15 06:30:13

标签: ruby zip sinatra

我正在构建一个用于管理订阅和生成邮件列表的应用程序。

我正在我的应用中构建一个功能,将每个订阅下的所有邮件列表导出为多个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 个答案:

答案 0 :(得分:1)

所以,我发现Sinatra有一个名为send_file的不同方法,在这种情况下比attachment方法效果更好。

使用send_file代替attachment可以正常使用。