Cara mengirim file yang dihasilkan secara dinamis di aplikasi Rails

Saya mencoba menyajikan file yang dibuat secara dinamis di aplikasi Rails, jadi ketika pengguna mengklik tautan tertentu, file tersebut dibuat dan dikirim ke klien menggunakan send_data.

File ini tidak dimaksudkan untuk digunakan kembali: merupakan file teks pendek dan pembuatan ulang harus sangat murah karena tidak akan banyak didownload; tetapi jika perlu atau nyaman saya dapat menyimpannya di database sehingga hanya dibuat satu kali.

Pertama, saya ingin membuat file di memori, dan mengirimkannya ke pengontrol. Saya mencoba mengarsipkan sesuatu seperti ini:

def DownloadsController < ApplicationController
  def project_file
    project = Project.find(params[:id])
    send_data project.generate_really_simply_text_file_report
  end
end

Tapi saya tidak tahu cara menghasilkan aliran di memori, jadi tidak ada file yang dibuat di sistem file.

Pilihan lain adalah membuat file dengan nama acak di direktori tmp aplikasi Rails dan mengirimkannya dari sana, tetapi kemudian file tersebut akan disimpan di sana, sesuatu yang saya tidak ingin terjadi.

Sunting: Kalau tidak salah, send_file memblokir petisi sampai file terkirim, sehingga bisa berfungsi...

Ada saran atau pendapat lain?

Terima kasih sebelumnya


person Ricardo Amores    schedule 04.02.2010    source sumber


Jawaban (1)


Jika masalahnya sederhana seperti yang Anda gambarkan, solusi sederhana seperti itu sudah cukup. Jangan lupa opsi :filename, jika tidak, file akan diberi nama "project_file".

  def project_file
    project = Project.find(params[:id])
    send_data project.generate_really_simply_text_file_report, :filename => "#{project.name}.txt"
  end

Sunting:

project#generate_really_simply_text_file_report Anda harus mengembalikan data biner, jalur file, atau String mentah.

  def download
    content = "chunky bacon\r\nis awesome"
    send_data content,  :filename => "bacon.txt" 
  end
person Lucas    schedule 04.02.2010
comment
Masalah saya adalah saya tidak tahu cara menghasilkan data biner untuk dikirim ke dalam memori. - person Ricardo Amores; 04.02.2010
comment
Terima kasih! Saya akhirnya menggunakan templat erb dengan metode render_to_string untuk menghasilkan data string. - person Ricardo Amores; 04.02.2010