2009-03-05 11 views
7

Ich habe eine Controller-Aktion, die es einem Benutzer ermöglicht, eine Datei mit der Erweiterung PPT herunterzuladen. Es ist nicht wirklich eine Powerpoint-Binärdatei, sondern nur ein XML-Format, das Powerpoint lesen kann. Die Datei wird von der Show-Aktion eines Controllers mit dem Namen ElementsController heruntergeladen, aber die Show-Aktion ist nicht wirklich im Controller definiert, es gibt jedoch eine Template-Datei dafür in app/views/elements/show.ppt.builder. Ich habe den Mime :: Typ registriert in config/initializers/mime_types.rb als solche:Einstellen des Dateinamens für eine heruntergeladene Datei in einer Rails-Anwendung

Mime::Type.register "multipart/related", :ppt

und die Datei-Downloads richtig, und öffnet sich mit Powerpoint auf einem Windows-System, aber das Problem ist 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 etwas beschreibender als 3.ppt zu setzen.

thx,

-C

Antwort

18

könnten Sie verwenden send_data:

send_data pptdata, :filename => 'your_file_name.ppt', 
    :disposition => 'inline', :type => "multipart/related" 

Ein weiterer Vorteil liegt darin, Sie x-sendfile verwenden können, so dass Sie nicht reinrassig/dünn isn sind‘ t wartet, während der Client die Daten herunterlädt.


andere Möglichkeit wäre, wie eine Route haben:

/elements/3/files/foo.ppt

Dann in der Show-Methode für den FilesController Sie unabhängig von den ID-Parameter senden wäre.

+0

das Problem mit send_data ist, dass ich die Methode öffnen müsste im controller und definiere respond_to tun | format |, was ich versuche zu vermeiden. –

+0

Was ist los mit respond_to? – jonnii

+0

Ich habe meine Frage mit einer anderen Idee aktualisiert. – jonnii

11

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 
+0

Danke, diese Antwort hat mir geholfen, meine eigene Frage zu beantworten (http://stackoverflow.com/questions/12902052/rails-3-set-the-filename-in-a-responde-to/12902958). –

3

Ok. Dies ist eine Antwort auf eine sehr alte Frage, aber wie von Rails 3.2 der einfachste Weg, es zu setzen mag:

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 

Source API Doc