Render :file ... y el filename?


#1

Hola gente.

Estoy intentando hacer un reder :file para enviar un fichero al
navegador pero el nombre de fichero que el navegador reconoce es el de
la acción del controlador y no el nombre original del fichero.

Es decir … yo tengo:

def export
render :file => ‘/tmp/hola.txt’
end

Y lo que le llega al navegador es un fichero llamada ‘export’ :confused:

He probado con:
render :file => ‘/tmp/hola.txt’, :filename => ‘pepe’
render :file => ‘/tmp/hola.txt’, :file_name => ‘pepe’

Y nada.

En la docu no viene nada:
http://api.rubyonrails.org/classes/ActionController/Base.html#M000633

Aunque tampoco viene nada del parámetro :content_type que sí que funciona :confused:

f.


#2

si lo que quieres es enviar un fichero al cliente, usa la opción
send_file:
http://api.rubyonrails.org/classes/ActionController/Streaming.html#M000401

tal como pone en la documentación, render :file lo que va a hacer es
utilizar la plantilla con el nombre de fichero absoluto que le has
indicado(se usa principalmente para utilizar plantillas fuera del ámbito
de
la aplicación rails)

salud!

2009/3/20 Fernando G. removed_email_address@domain.invalid


#3

2009/3/20 Borja Martín removed_email_address@domain.invalid:

si lo que quieres es enviar un fichero al cliente, usa la opción send_file:
http://api.rubyonrails.org/classes/ActionController/Streaming.html#M000401

tal como pone en la documentación, render :file lo que va a hacer es
utilizar la plantilla con el nombre de fichero absoluto que le has
indicado(se usa principalmente para utilizar plantillas fuera del ámbito de
la aplicación rails)

Genial … gracias… me ofusqué con el render :file y no me fijé que
había otras maneras.

f.


#4

2009/3/20 Fernando G. removed_email_address@domain.invalid

Estoy intentando hacer un reder :file para enviar un fichero al
navegador pero el nombre de fichero que el navegador reconoce es el de
la acción del controlador y no el nombre original del fichero.

Si no utilizas send_file como bien dice borja Martín, tendrás que poner
la
cabecera a mano.
Tienes que establecer la cabecera:

headers[“Content-Disposition”]

Que viene especificada en el rfc2183.
http://www.ietf.org/rfc/rfc2183.txt

En la página 2 del dicho documento dice:

In the extended BNF notation of [RFC 822], the Content-Disposition

header field is defined as follows:

disposition := “Content-Disposition” “:”

             disposition-type

             *(";" disposition-parm)

disposition-type := “inline”

                / "attachment"

                / extension-token

                ; values are not case-sensitive

disposition-parm := filename-parm

                / creation-date-parm

                / modification-date-parm

                / read-date-parm

                / size-parm

                / parameter

filename-parm := “filename” “=” value

creation-date-parm := “creation-date” “=” quoted-date-time

modification-date-parm := “modification-date” “=” quoted-date-time

read-date-parm := “read-date” “=” quoted-date-time

size-parm := “size” “=” 1*DIGIT

quoted-date-time := quoted-string

               ; contents MUST be an RFC 822 `date-time'

               ; numeric timezones (+HHMM or -HHMM) MUST be used

Como ves, puedes especificar todo.
Si quieres, hacer un helper o plugin para manejar dicha cabecera
facilmente
con un hash sería útils.

Resumiendo, y si no me equivoco:

headers[“Content-Disposition”] = “inline; filename=‘nombre de
archivo’”

Como cosa interesante, el inline.

Inline significa que lo abra el navegador (los pdfs incrustados).
Si en vez de inline, pones attachment, el archivo se descargara (los
pdfs
que se descargan).

Un Saludo.


#5

Ya para completar el comentario de Guillermo, mencionar que existe una
cabecera que soportan algunos navegadores(creo que aparte de apache y
lighttpd, nginx también, o al menos tenía una parecida) para enviar los
ficheros más rápido y evitar que rails se tenga que preocupar en leerlo:

http://john.guen.in/past/2007/4/17/send_files_faster_with_xsendfile/

Saludos

2009/3/20 Guillermo removed_email_address@domain.invalid


#6

Gracias Guillermo… siempre al filo de lo imposible :wink:

2009/3/20 Guillermo removed_email_address@domain.invalid:


#7

Añadamos tambien el post de “The Rails Way” para completar un poco más
el thread.

http://www.therailsway.com/2009/2/22/file-downloads-done-right

2009/3/20 Borja Martín removed_email_address@domain.invalid: