impostazione del nome file per un file scaricato in un'applicazione rails
-
03-07-2019 - |
Domanda
Ho un'azione del controller che consente a un utente di scaricare un file con estensione .ppt. Non è proprio un binario di powerpoint, solo un formato xml che powerpoint può leggere. il file viene scaricato dall'azione show di un controller chiamato ElementsController, ma l'azione show non è effettivamente definita nel controller, tuttavia esiste un file modello per esso in app / views / elements / show.ppt.builder. Ho il Mime :: Type registrato in config / initializer / mime_types.rb come tale:
Mime :: Type.register " multipart / related " ;,: ppt
e il file viene scaricato correttamente e si apre con powerpoint su un sistema Windows, ma il problema è il nome file. il nome del file è 3.ppt dove tre è il parametro id nell'URL. Vorrei sapere se esiste un modo per impostare il nome file su qualcosa di un po 'più descrittivo di 3.ppt.
thx,
-C
Soluzione
Puoi utilizzare send_data :
send_data pptdata, :filename => 'your_file_name.ppt',
:disposition => 'inline', :type => "multipart/related"
Un altro vantaggio di questo è che puoi usare x-sendfile, in modo che tu non sia in attesa / thin mentre il client scarica i dati.
Un'altra opzione sarebbe quella di avere un percorso come:
/elements/3/files/foo.ppt
Quindi nel tuo metodo show per FilesController puoi inviare qualunque sia il parametro id.
Altri suggerimenti
Un possibile esempio:
def show
@item = Item.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.ppt {
response.headers['Content-Disposition'] = "attachment; filename=\"#{@item.filename}.ppt\""
} # show.ppt.erb
format.xml { render :xml => @item }
end
end
Ok. Questa è una risposta a una domanda molto antica, ma a partire da Rails 3.2 il modo più semplice è impostarlo come:
respond_to do |format|
format.html # index.html.erb
format.json { render json: @product }
format.csv { send_data @product.to_csv, :filename => "New-Product-filename.csv" }
format.xls
end