Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » Forzar a navegador a descargar archivo  RESUELTO Responder al tema
Nuevo tema


Página 1 de 1  [ 8 mensajes ] 
 
Nota 2010-06-07 18:29 @812

Perlero Nuevo
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico
Mensajes: 60
Forzar a navegador a descargar archivo
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.

_________________
Say hello to my little friend!!!


Nota 2010-06-07 23:09 @006
Avatar de Usuario
Vive para Perl en Español
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia
Mensajes: 551
Re: Forzar a navegador a descargar archivo
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í:

Syntax: [ Download ] [ Hide ]
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();

_________________
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org


Nota 2010-06-08 06:39 @319
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Forzar a navegador a descargar archivo
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():
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
print header (
    -type => 'image/jpg',
    -Content-disposition => "attachment; filename=$nombre_de_la_imagen",
    -Content_length => -s $nombre_de_la_imagen,
);


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


Nota 2010-06-08 10:53 @495

Perlero Nuevo
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico
Mensajes: 60
Re: Forzar a navegador a descargar archivo
Muy bien,

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

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
print header (
   -type => "image/jpg",
   -attachment => "tool.jpg",
   -content_length => -s "tool.jpg",
);
 

_________________
Say hello to my little friend!!!


Nota 2010-06-08 10:56 @497
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Forzar a navegador a descargar archivo
Humm... que tool.jpg no está en el mismo directorio que el CGI que estás ejecutando.

_________________
JF^D Perl programming


Nota 2010-06-08 10:58 @498
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Forzar a navegador a descargar archivo
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


Nota 2010-06-08 11:25 @517

Perlero Nuevo
Registrado: 2008-10-28 11:29 @520
Ubicación: Chihuahua, Chih. Mexico
Mensajes: 60
Re: Forzar a navegador a descargar archivo
Sí, me faltaba leer el archivo.

Syntax: [ Download ] [ Hide ]
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.  


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?

_________________
Say hello to my little friend!!!


Nota 2010-06-08 17:38 @776
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Forzar a navegador a descargar archivo  RESUELTO
Sí, con cambiar el type, vale.

_________________
JF^D Perl programming


Responder al tema  [ 8 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO