Forum: Rails-ES Problema con link de descarga

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.
Romina C. (Guest)
on 2009-01-27 21:51
Hola, primero que todo felicitarlos por este espacio ta bueno para dudas
y consultas sobre ruby on rails que lamentablemente, hoy en dia no es
muy conocido.

Mi consulta es la siguiente:
resulta que necesito subir archivos a una BD mysql (sé que no es lo
mejor pero es una exigencia del trabajo). Hasta el momento, creo que he
logrado subir el archivo a un binary o blob.

Mi problema ahora está, en que necesito que los usuarios puedan
posteriormente descargar este archivo y no he podido encontrar la
solucion.

Pude hacerlo con una imagen, pero al tratarlo como un archivo no
funciona.
Creo que mi problema, principalmente está en la vista (a lo mejor me
equivoco), pero por ejemplo, para mostrar una imagen pongo:

<%= image_tag("/photos/code_image/#{@photo.id}", :alt => "Image") %>

y en el controlador tengo:

def code_image
  @image_data = Photo.find(params[:id])
          @image = @image_data.binary_data
          send_data (@image, :type => @image_data.content_type,
:filename => @image_data.filename, :disposition => "downloaded")

end


y funciona bien.

Quisiera poder hacer que, por ejemplo, el nombre de mi archivo (que
puede ser un doc o pdf, etc) sea un link y que al presionarlo se pueda
descargar el archivo.

Agradezco de antemano.
Ceritium (Guest)
on 2009-01-27 22:06
(Received via mailing list)
Prueba con send_data

2009/1/27 Romina C. <removed_email_address@domain.invalid>
javier ramirez (Guest)
on 2009-01-27 22:14
(Received via mailing list)
> Creo que mi problema, principalmente está en la vista (a lo mejor me
> equivoco)

no.. en la vista creo que no tienes el problema.. la vista simplemente
presentará un link a una action en la que pasarás el id del registro
donde está el blob a descargar.

> def code_image
>   @image_data = Photo.find(params[:id])
>           @image = @image_data.binary_data
>           send_data (@image, :type => @image_data.content_type,
> :filename => @image_data.filename, :disposition => "downloaded")
>
> end
>

tienes que hacer algo muy parecido. Primero un find del registro donde
tengas el campo blob. En este caso el binary data es la columna blob en
sí misma, el type sólo lo puedes saber si a la hora de subir el fichero
te lo has guardado en otro campo de la tabla, y lo mismo con el nombre.
Como imagino que tienes esos dos campos en otras dos columnas, lo que te
queda es algo parecido a

def download_file
  file_info= FileInfo.find(params[:id])
  send_data (file_info.el_campo_del_blob, :type =>
file_info.el_campo_del_mime_type,
:filename => file_info.el_campo_del_filename, :disposition =>
"attachment")

end


suerte,



--
javier ramírez

..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
..you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez
Romina C. (Guest)
on 2009-01-27 22:34
> tienes que hacer algo muy parecido. Primero un find del registro donde
> tengas el campo blob. En este caso el binary data es la columna blob en
> sí misma, el type sólo lo puedes saber si a la hora de subir el fichero
> te lo has guardado en otro campo de la tabla, y lo mismo con el nombre.
> Como imagino que tienes esos dos campos en otras dos columnas, lo que te
> queda es algo parecido a
>
> def download_file
>   file_info= FileInfo.find(params[:id])
>   send_data (file_info.el_campo_del_blob, :type =>
> file_info.el_campo_del_mime_type,
> :filename => file_info.el_campo_del_filename, :disposition =>
> "attachment")
>
> end
>
>
> suerte,


Gracias por responder tan rapido...la verdad si entiendo lo que me
dices, mi problema es que en la vista no se qué poner. Nunca me ha
quedado claro eso y llevo como 3 dias aprendiendo esto.

Te agradecería enormemente si me pudieras orientar sobre qué poner en la
vista...cómo que se supone que hago que en el nombre del archivo se
convierta en un link que me sirva para bajar dicho archivo.

Sorry la molestia y muchas gracias!!
Ceritium (Guest)
on 2009-01-27 23:10
(Received via mailing list)
Perdón, ya vi que lo estás usando, al menos en el ejemplo de la imagen.

Quizás no pongas bien algún parámetro del sendata como el  ":type"
Ceritium (Guest)
on 2009-01-27 23:17
(Received via mailing list)
Ok, en la vista lo que tienes que poner es un link a la acción de
descarga,
por ejemplo:


# En la vista
= link_to 'Download', download_pdf_profiles_path(@profile)


# En el controlador
def download_pdf
  @pdf = Profile.find params[:id]
  send_data @pdf.data, :type => 'application/pdf', :filename => 'lo que
sea.pdf'
end

Creo que con eso bastaría, lo escribo de memoría.



2009/1/27 Romina C. <removed_email_address@domain.invalid>
Romina C. (Guest)
on 2009-01-28 13:40
> # En la vista
> = link_to 'Download', download_pdf_profiles_path(@profile)
>
>
> # En el controlador
> def download_pdf
>   @pdf = Profile.find params[:id]
>   send_data @pdf.data, :type => 'application/pdf', :filename => 'lo que
> sea.pdf'
> end

Hola de nuevo
disculpa lo que no entiendo es que en la vista llamas al metodo
download_pdf_profiles_path pero en el controlador el metodo se llama
download_pdf.

Por ejemplo si mi metodo en el controlador se llama download_file...
como tendré que llamarlo en la vista???

Muchas gracias de nuevo, creo que cuando entienda bien esto de llamar
metodos de la vista todo será mucho mejor XD.

Saludos
Ceritium (Guest)
on 2009-01-28 14:00
(Received via mailing list)
2009/1/28 Romina C. <removed_email_address@domain.invalid>

>
> Hola de nuevo
> disculpa lo que no entiendo es que en la vista llamas al metodo
> download_pdf_profiles_path pero en el controlador el metodo se llama
> download_pdf.


download_pdf es un recurso de profiles, download_pdf_profiles_path  es
en
realidad la ruta que te lleva hasta /profiles/:id/download_pdf

Si pones en tu routes.rb algo como lo que pongo a continuación lo podrás
hacer.

map.resources :profiles, :member => {:download_pdf => :get}

si no sabes de lo que hablo mirate algo de "rutas restfull"

De todas formas, si no sabes lo que es te pongo el mismo ejemplo sin
rutas
restful.

= link_to 'Download', {:action => 'download_pdf', :id => @profile}
Romina C. (Guest)
on 2009-01-28 14:09
> realidad la ruta que te lleva hasta /profiles/:id/download_pdf
>
> Si pones en tu routes.rb algo como lo que pongo a continuación lo podrás
> hacer.
>
> map.resources :profiles, :member => {:download_pdf => :get}
>
> si no sabes de lo que hablo mirate algo de "rutas restfull"
>
> De todas formas, si no sabes lo que es te pongo el mismo ejemplo sin
> rutas
> restful.
>
> = link_to 'Download', {:action => 'download_pdf', :id => @profile}


AAhh!!!! funciona!!
muchisimas gracias, voy a echar un vistazo a lo de las rutas para
entenderlo mejor. Me haz salvado la vida.

Saludos!
Andrés G. (Guest)
on 2009-01-28 14:55
(Received via mailing list)
>> = link_to 'Download', download_pdf_profiles_path(@profile)
Por aclarar conceptos, una duda REST. La ruta de arriba no sería > =
link_to
'Download', download_pdf_*profile*_path(@profile)
Sin la *s *de profile. Lo digo porque es un recurso singular como un
show,
no como un index. Lo que le pasas es un params[:id] concreto

Igual me lio.

Un saludo Ceritium :-)

El 28 de enero de 2009 13:09, Romina C. <
removed_email_address@domain.invalid> escribió:
Ceritium (Guest)
on 2009-01-28 19:15
(Received via mailing list)
On Wed, Jan 28, 2009 at 1:54 PM, Andrés gutiérrez
<removed_email_address@domain.invalid>wrote:

> >> = link_to 'Download', download_pdf_profiles_path(@profile)
> Por aclarar conceptos, una duda REST. La ruta de arriba no sería > =
> link_to 'Download', download_pdf_*profile*_path(@profile)
> Sin la *s *de profile. Lo digo porque es un recurso singular como un show,
> no como un index. Lo que le pasas es un params[:id] concreto


No te lias, tienes toda la razón, se me escapó la "S".
Andrés G. (Guest)
on 2009-01-28 19:49
(Received via mailing list)
No te lias, tienes toda la razón, se me escapó la "S".

:))))) Me alegro tanto. algo voy pillando.

Un saludo

El 28 de enero de 2009 18:14, Ceritium <removed_email_address@domain.invalid> 
escribió:
This topic is locked and can not be replied to.