Streaming de arquivos no Rails

Rails tem send_datae send_file. O último trabalha com blobs de dados e o primeiro trabalha com arquivos no servidor. Blobs de dados só funcionam se você já tiver isso na memória e divisão de arquivos quando você tiver vários servidores. E se você quiser transmitir para o navegador enquanto lê do banco de dados?

Você pode criar um objeto streamer para entregar dados conforme você os busca no banco de dados. Você só precisa definir o corpo da resposta para um objeto para o qual a resposta each.

Coloque isso em seu controlador:

def download
report
= StoredReport.first

headers
["Content-Type"] = "text/csv"
headers
["Content-disposition"] = "attachment; filename=test.csv"

self.response_body = StoredReportStreamer.new(report)
end

Certifique-se de incluir o material do cabeçalho para marcá-lo como o tipo correto e como um download.

Então, para o objeto streamer, use isto:

class StoredReportStreamer
attr_accessor
:report

def initialize(report)
self.report = report
end

def each
report
.rows.each do |row|
yield row
end
end
end

Isso produzirá cada linha do relatório para o navegador.

Obrigado a esta postagem no blog pela dica: http://blog.sparqcode.com/2012/02/04/streaming-data-with-rails-3-1-or-3-2/