2009-03-05 8 views
7

Ho un'azione controller che consente a un utente di scaricare un file con estensione .ppt. Non è davvero un binario powerpoint, solo un formato xml-ish che powerpoint può leggere. il file viene scaricato dall'azione show di un controller chiamato ElementsController, ma l'azione dello show non è effettivamente definita nel controller, tuttavia esiste un file modello per esso in app/views/elements/show.ppt.builder. Ho il Mime :: Tipo registrati in config/inizializzatori/mime_types.rb come tale:impostazione del nome file per un file scaricato in un'applicazione rails

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

ei download di file correttamente, e si apre con powerpoint su un sistema Windows, ma il problema è il nome del file. il nome del file è 3.ppt dove tre è il parametro id nell'URL. Mi piacerebbe sapere se c'è un modo per impostare il nome del file su qualcosa di un po 'più descrittivo di 3.ppt.

thx,

-C

risposta

18

Si potrebbe utilizzare send_data:

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

Un altro vantaggio di questo è che si può utilizzare x-sendfile, in modo che tu sei bastardo/isn sottile' t in attesa mentre il client scarica i dati.


Un'altra opzione sarebbe quella di avere un percorso simile:

/elements/3/files/foo.ppt

Poi, nel tuo metodo di spettacolo per il FilesController è possibile inviare qualunque sia il parametro id sarebbe.

+0

il problema con Send_Data è che avrei dovuto aprire il metodo nel controller e definire respond_to do | format |, che è quello che sto cercando di evitare. –

+0

Cosa c'è di sbagliato con respond_to? – jonnii

+0

Ho aggiornato la mia domanda con un'altra idea. – jonnii

11

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

Grazie, questa risposta mi ha aiutato a rispondere [alla mia domanda] (http://stackoverflow.com/questions/12902052/rails-3-set-the-filename-in-a-respond-to/12902958). –

3

Ok. Si tratta di una risposta per una domanda molto vecchio, ma come di Rails 3.2 il modo più semplice è quello di impostare le cose 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 

Source API Doc