Problema con link de descarga


#1

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.


#2

Prueba con send_data

2009/1/27 Romina C. removed_email_address@domain.invalid


#3

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!!


#4

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”


#5

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


#6

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


#7

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


#8

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!


#9

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}


#10

On Wed, Jan 28, 2009 at 1:54 PM, Andrés gutiérrez
removed_email_address@domain.invalidwrote:

= 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”.


#11

= 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 :slight_smile:

El 28 de enero de 2009 13:09, Romina C. <
removed_email_address@domain.invalid> escribió:


#12

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ó: