Devolver un fichero estático después de comprebar permisos

Hola,

Quería que al ejecutar una acción dentro de un controlador, donde
previamente se ha comprobado que esta logueado correctamente,
se puedea devolver un fichero .zip al usuario que ejecuto la acción.

La cuestión es que no encuentro como,
render :file => “path” lo que hace es escribir el fichero en el
navegador y no descargarlo. Ahora se me ocurre que debería modificar
la cabecera de Content-type de respuesta para que la interprete el
navegador, ¿Estoy en lo cierto?

De todos modos será lo primero que pruebe mañana por la mañana.

Un saludo

On 31/03/2008, Paco G. Rivas [email protected] wrote:

Hola,

Quería que al ejecutar una acción dentro de un controlador, donde
previamente se ha comprobado que esta logueado correctamente,
se puedea devolver un fichero .zip al usuario que ejecuto la acción.

La cuestión es que no encuentro como,

Hola Paco,

utiliza send_file

http://api.rubyonrails.org/classes/ActionController/Streaming.html#M000072

Esta y otras cosas en:
http://www.rubyinside.com/19-rails-tricks-most-rails-coders-dont-know-131.html


Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o http://simplelogica.net/logicola/
Recuerda comer mucha fruta y verdura.

El lun, 31-03-2008 a las 17:29 +0000, Paco G. Rivas escribió:

navegador, ¿Estoy en lo cierto?

De todos modos será lo primero que pruebe mañana por la mañana.

Un saludo

Hola

Prueba con send_file o send_data, creo que hace lo que quieres
http://api.rubyonrails.com/classes/ActionController/Streaming.html

saludos,
Amaia


Amaia C.
Dabne Tecnologías de la Información - www.dabne.net -
http://blog.dabne.net
*
Buscador de Subvenciones - http://buscaboe.dabne.net
Apuntes de Rails - http://apuntesderails.amaiac.net
*

Jajaja, después de esta andanada de respuestas en paralelo creo que no se puede acusar a la lista de falta de respuesta ante preguntas de nivel básico :D

2008/3/31 Paco G. Rivas [email protected]:

navegador, ¿Estoy en lo cierto?
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Si tu aplicación va a crecer más que un “juguete” te recomiendo que
mires el plugin XSendfile
http://john.guen.in/past/2007/4/17/send_files_faster_with_xsendfile/,
que utiliza la cabecera X-Sendfile que Apache, Lighttpd y Mongrel
reconocen (pero no Webrick, por lo que tendrás que desarrollar con
Mongrel). Incluso puede sustituir por completo la llamada send_file
(una solución de compromiso para desarrollar con Webrick, y en
producción utilizar X-Sendfile).

El problema de send_file, es que a pesar del parámetro :stream hace
que Ruby lea el archivo en memoria, mientras se lo pasa a Apache, algo
que Apache sabe hacer muy bien (y más rápido que Ruby).

Suerte.

El 31/03/08, Daniel R. Troitiño [email protected]
escribió:> que Ruby lea el archivo en memoria, mientras se lo pasa a Apache, algo

que Apache sabe hacer muy bien (y más rápido que Ruby).

Muy interesante esto, no lo conocía, gracias Daniel!
(En el propio enlace comentan que en edge ya se puede usar X-Sendfile,
pero mientras tanto este plugin puede ser muy útil).

Osti tu que bueno, esto no lo sabia.

Gracias por el consejo.

Francesc

On Mar 31, 2008, at 9:17 PM, Daniel R. Troitiño wrote:

El 31/03/08, Paco G. Rivas [email protected]
escribió:> Quería que al ejecutar una acción dentro de un controlador, donde

previamente se ha comprobado que esta logueado correctamente,
se puedea devolver un fichero .zip al usuario que ejecuto la acción.

La cuestión es que no encuentro como,
render :file => “path” lo que hace es escribir el fichero en el navegador y
no descargarlo. Ahora se me ocurre que debería modificar
la cabecera de Content-type de respuesta para que la interprete el
navegador, ¿Estoy en lo cierto?

Sí, para todo esto puedes usar send_file:
http://api.rubyonrails.org/classes/ActionController/Streaming.html#M000228

2008/3/31 Xavier N. [email protected]:

producción utilizar X-Sendfile).

Como truco, yo dejo send_file en el codigo y pongo esto en la
inicializacion:

if RAILS_ENV == 'production'
  ...
  XSendFile::Plugin.replace_send_file!
end

Esa es la otra solución que comentaba, pero estaba en plan responder
rápido y no lo he escrito.

On Mar 31, 2008, at 21:17 , Daniel R. Troitiño wrote:

Si tu aplicación va a crecer más que un “juguete” te recomiendo que
mires el plugin XSendfile
<http://john.guen.in/past/2007/4/17/send_files_faster_with_xsendfile/

,
que utiliza la cabecera X-Sendfile que Apache, Lighttpd y Mongrel
reconocen (pero no Webrick, por lo que tendrás que desarrollar con
Mongrel). Incluso puede sustituir por completo la llamada send_file
(una solución de compromiso para desarrollar con Webrick, y en
producción utilizar X-Sendfile).

Como truco, yo dejo send_file en el codigo y pongo esto en la
inicializacion:

if RAILS_ENV == 'production'
  ...
  XSendFile::Plugin.replace_send_file!
end

El problema de send_file, es que a pesar del parámetro :stream hace
que Ruby lea el archivo en memoria, mientras se lo pasa a Apache, algo
que Apache sabe hacer muy bien (y más rápido que Ruby).

Ademas de que liberas ese mongrel.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs