• Publicidad

Forzar a navegador a descargar archivo

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Forzar a navegador a descargar archivo

Notapor bAsTeR » 2010-06-07 18:29 @812

Hola,

Tengo una pregunta que no encuentro solución, o al menos a mi no me funciona.

Necesito un código para forzar al navegador a descargar un archivo, esto es, tengo un sistema donde subo archivos a mi servidor, estos pueden ser imágenes, audio y más, pero resulta que cuando quiero descargar un archivo éste se abre en el navegador, en el caso de las imágenes, en el reproductor de audio en el caso de audios, y así.

Por lo que necesito que el usuario al dar clic, se abra la ventana donde él escoja dónde guardar el archivo. Vi un código en PHP y traté de pasarlo a Perl pero no lo conseguí.

Alguna pista, amigos.

Gracias.
Always Perl :)
bAsTeR
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico

Publicidad

Re: Forzar a navegador a descargar archivo

Notapor danimera » 2010-06-07 23:09 @006

No es una solución al problema, pero súbelos comprimidos. Ahí sí te permitirá descargar... :D

No, mentiras... Puedes usar File::Download para hacer la descarga. Es recomendado para archivos grandes, pero es algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 my $dwn = File::Download->new({
     file => $argfile,
     overwrite => 1,
     mode => ($opt{a} ? 'a' : 'b'),
   });

   print "Downloading $url\n";
   print $dwn->download($url);
   print $dwn->status();
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Forzar a navegador a descargar archivo

Notapor explorer » 2010-06-08 06:39 @319

Es muy sencillo... solo tienes que agregar

Content-disposition: attachment; filename=fichero

a la cabecera HTTP de la respuesta a la petición que te hace el cliente.

Si usas el módulo CGI, te vale con ponerlo en el header():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print header (
    -type => 'image/jpg',
    -Content-disposition => "attachment; filename=$nombre_de_la_imagen",
    -Content_length => -s $nombre_de_la_imagen,
);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El Content_length es opcional, la mayoría de los casos, pero así el usuario (su sistema operativo) sabe cómo de largo es el fichero que estás transmitiendo.

El valor que se le pasa a type es el MIME Type del fichero a transmitir. En el ejemplo, una imagen.

El File::Download que te indica danimera es para justo lo contrario (descargarte un fichero), no para subir un fichero hacia el usuario.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Forzar a navegador a descargar archivo

Notapor bAsTeR » 2010-06-08 10:53 @495

Muy bien,

Ya descarga el archivo pero el detalle es que lo descarga de 0 bytes. ¿Cuál puede ser el problema?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print header (
   -type => "image/jpg",
   -attachment => "tool.jpg",
   -content_length => -s "tool.jpg",
);
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Always Perl :)
bAsTeR
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico

Re: Forzar a navegador a descargar archivo

Notapor explorer » 2010-06-08 10:56 @497

Humm... que tool.jpg no está en el mismo directorio que el CGI que estás ejecutando.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Forzar a navegador a descargar archivo

Notapor explorer » 2010-06-08 10:58 @498

Y además, ten en cuanta que con header() solo envías la cabecera HTTP. Luego debes enviar el fichero. Para ello, debes hacer un bucle, leer el fichero original (en binario), y mandarlo por la salida estándar (que es donde está escuchando el cliente).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Forzar a navegador a descargar archivo

Notapor bAsTeR » 2010-06-08 11:25 @517

Sí, me faltaba leer el archivo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print header (
  2.    -type => "image/jpg",
  3.    -attachment => "tool.jpg",
  4.    -content_length => -s "tool.jpg",
  5. );
  6.  
  7. open(OUTFILE,"<tool.jpg");
  8. binmode(OUTFILE);
  9. while(<OUTFILE>){
  10.    print "$_";
  11. }
  12. close(OUTFILE);
  13.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Otra pregunta. En teoría, si quisiera hacerlo para todos los tipos de archivos, tendría que cambiar solamente el type en el header, ¿o qué tendría que hacer?
Always Perl :)
bAsTeR
Perlero nuevo
Perlero nuevo
 
Mensajes: 63
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico

Re: Forzar a navegador a descargar archivo

Notapor explorer » 2010-06-08 17:38 @776

Sí, con cambiar el type, vale.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados