Festlegen des Dateinamens für eine heruntergeladene Datei in einer Rails -Anwendung
-
03-07-2019 - |
Frage
Ich habe eine Controller -Aktion, mit der ein Benutzer eine Datei mit einer Erweiterung von .ppt herunterladen kann. Es ist nicht wirklich ein Powerpoint-Binär, nur ein XML-ISH-Format, das Powerpoint lesen kann. Die Datei wird aus der Show -Aktion eines Controllers namens ElementsController heruntergeladen. Die Show -Aktion ist jedoch nicht im Controller definiert. Es gibt jedoch eine Vorlagendatei in App/Ansichten/Elementen/show.ppt.builder. Ich habe den mime :: Typ registriert in config/Initializer/mime_types.rb als solche:
Mime::Type.register "multipart/related", :ppt
und die Datei lädt ordnungsgemäß herunter und wird mit PowerPoint in einem Windows -System geöffnet. Das Problem ist jedoch der Dateiname. Der Name der Datei ist 3.PPT, wobei drei der ID -Parameter in der URL ist. Ich würde gerne wissen, ob es eine Möglichkeit gibt, den Dateinamen auf etwas beschreibender als 3.PPT zu setzen.
Danke,
-C
Lösung
Du könntest benutzen schicke Daten:
send_data pptdata, :filename => 'your_file_name.ppt',
:disposition => 'inline', :type => "multipart/related"
Ein weiterer Vorteil davon ist, dass Sie X-Sendfile verwenden können, damit Sie Mischgläubel/Dünn nicht warten, während der Client die Daten herunterlädt.
Eine andere Option wäre eine Route wie:
/Elements/3/files/foo.ppt
In Ihrer Show -Methode für den Dateicontroller können Sie dann alles senden, was der ID -Parameter sein würde.
Andere Tipps
Ein mögliches Beispiel:
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. Dies ist eine Antwort für eine sehr alte Frage, aber ab Rails 3.2 ist es einfach, sie so zu setzen:
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