2009-03-05 18 views
7

Tengo una acción de controlador que permite a un usuario descargar un archivo con una extensión de .ppt. No es realmente un binario de PowerPoint, solo un formato xml-ish que Powerpoint puede leer. el archivo se descarga de la acción show de un controlador llamado ElementsController, pero la acción show no está realmente definida en el controlador, sin embargo, hay un archivo de plantilla para ella en la aplicación/views/elements/show.ppt.builder. Tengo el mimo :: Tipo registrada en config/inicializadores/mime_types.rb como tal:configuración del nombre de archivo para un archivo descargado en una aplicación de rieles

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

y el archivo se descarga correctamente, y se abre con PowerPoint en un sistema de ventanas, sin embargo, el problema es el nombre de archivo. el nombre del archivo es 3.ppt donde tres es el parámetro id en la url. Me gustaría saber si hay alguna manera de establecer el nombre del archivo en algo un poco más descriptivo que 3.ppt.

THX,

-C

Respuesta

18

Usted podría utilizar send_data:

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

Otra ventaja de esto es que puede utilizar X-sendfile, por lo que eres mestizo/ISN delgada' t esperando mientras el cliente descarga los datos.


Otra opción sería tener una ruta como:

/elements/3/files/foo.ppt

Luego, en su demostración del método para la FilesController puede enviar cualquiera que sea el parámetro id sería.

+0

el problema con send_data es que iba a tener que abrir el método en el controlador y defina respond_to do | format |, que es lo que intento evitar. –

+0

¿Qué pasa con responder_a? – jonnii

+0

Actualicé mi pregunta con otra idea. – jonnii

11

Un posible ejemplo:

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

Gracias, esta respuesta me ayudó a responder [mi propia pregunta] (http://stackoverflow.com/questions/12902052/rails-3-set-the-filename-in-a-respond-to/12902958). –

3

Ok. Esta es una respuesta para una pregunta muy antigua, pero a partir de Rails 3.2 de la forma más sencilla es configurarlo como:

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

Cuestiones relacionadas