Forum: Rails-ES render :file ... y el filename?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (fguillen)
on 2009-03-20 12:40
(Received via mailing list)
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' :/

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/ActionControlle...

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

f.
90ea347c45cdfbc1c5767dd6304d9c10?d=identicon&s=25 Borja Martín (Guest)
on 2009-03-20 12:51
(Received via mailing list)
si lo que quieres es enviar un fichero al cliente, usa la opción
send_file:
http://api.rubyonrails.org/classes/ActionControlle...

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 Guillen <fguillen.mail@gmail.com>
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (fguillen)
on 2009-03-20 12:58
(Received via mailing list)
2009/3/20 Borja Martín <borjam@dagi3d.net>:
> si lo que quieres es enviar un fichero al cliente, usa la opción send_file:
> http://api.rubyonrails.org/classes/ActionControlle...
>
> 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.
39086eb3d9a1437276d07c08ea0c3821?d=identicon&s=25 Guillermo (Guest)
on 2009-03-20 13:00
(Received via mailing list)
2009/3/20 Fernando Guillen <fguillen.mail@gmail.com>

> 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.
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (fguillen)
on 2009-03-20 13:02
(Received via mailing list)
Gracias Guillermo.. siempre al filo de lo imposible ;)

2009/3/20 Guillermo <guillermo@cientifico.net>:
90ea347c45cdfbc1c5767dd6304d9c10?d=identicon&s=25 Borja Martín (Guest)
on 2009-03-20 13:16
(Received via mailing list)
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_fast...

Saludos

2009/3/20 Guillermo <guillermo@cientifico.net>
F625b891618be8ec32547a07b3192bb0?d=identicon&s=25 Francesc Esplugas (fesplugas)
on 2009-03-20 13:24
(Received via mailing list)
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-download...

2009/3/20 Borja Martín <borjam@dagi3d.net>:
This topic is locked and can not be replied to.