rel http menanggapi file excel Donwload

Oct 26 2020

saya melihat kode ini di github

require "csv"

csv_str = CSV.generate do |csv|
 csv << ["awesome", "csv"]
end

result = IO.popen("secure-spreadsheet --password secret", "r+") do |io|
 io.write(csv_str)
 io.close_write
 io.read
end

File.open("output.xlsx", "w") { |f| f.write(result) }

kode ini menyimpan file Excel (output.xlsx) di file proyek saya.

bagaimana cara mengubah "skenario penyimpanan file" ini menjadi "mengunduh file di browser"?

Jawaban

1 Ezenwa Oct 26 2020 at 12:06

Di config / initializers / mime_types.rb Anda, daftarkan xlsx mime_type (Ini tidak tersedia di Rails secara default):

Mime::Type.register "application/xlsx", :xlsx

Dengan asumsi kode Anda yang melakukan pekerjaan pembuatan excel dan dalam metode pengontrol (pribadi) bernama excel_file(saya pikir lebih baik untuk mengekstrak ke kelas layanan / lib):

def excel_file
  csv_str = CSV.generate do |csv|
    csv << ["awesome", "csv"]
  end

  IO.popen("secure-spreadsheet --password secret", "r+") do |io|
    io.write(csv_str)
    io.close_write
    io.read
  end
end

Dalam tindakan pengontrol Anda, Anda harus dapat melakukan sesuatu seperti ini

def download_excel
  respond_to do |format|
    format.xlsx { send_data excel_file, type: 'application/xlsx; header=present', disposition: "attachment", filename: "output.xlsx"  }
  end
end

( ActionController # send_data "mengirimkan data biner yang diberikan ke browser". Baca selengkapnya melalui tautan itu)

Jika Anda memiliki pandangan, Anda dapat memiliki tautan unduhan

<%= link_to "Download", your_download_path(format: "xlsx") %>

Pengguna harus dapat mengunduh file excel melalui tautan