rails risposta http al file excel di Donwload

Oct 26 2020

ho visto questo codice in 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) }

questo codice memorizza un file Excel (output.xlsx) nel mio file di progetto.

come posso convertire questo "scenario del file di archivio" in "scaricare il file nel browser"?

Risposte

1 Ezenwa Oct 26 2020 at 12:06

Nel tuo config / initializers / mime_types.rb registra xlsx mime_type (non è disponibile in Rails per impostazione predefinita):

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

Supponendo che il tuo codice che esegue la generazione di Excel funzioni e si trovi in ​​un metodo controller (privato) denominato excel_file(penso sia meglio estrarre in una classe service / 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

Nell'azione del controller dovresti essere in grado di fare qualcosa del genere

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 "invia i dati binari forniti al browser". Leggi di più tramite quel link)

Se hai una vista, puoi avere un link per il download

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

Gli utenti dovrebbero essere in grado di scaricare il file excel tramite il collegamento