Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Que una URL te dé como consecuencia un archivo ZIP

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Jue May 22, 2008 11:41 am
piero66
Perlero Nuevo
Perlero Nuevo
Registrado: 22 May 2008
Mensajes: 34
Que una URL te dé como consecuencia un archivo ZIP Responder citando

Tengo un problema grande para mi, pero tal vez pequeño para Uds.

Necesito que una URL, me dé como consecuencia un archivo zip.

Es decir, si yo pongo esto: https://misition.com.mx/cgi-bin/programas.cgi?nombrezip=140_archivo.zip
me de como consecuencia un archivo zip.

Yo ya se la ubicación de ese archivo y ya lo tengo creado.

Le dejo el código que tengo, pero no me funciona, lo que me hace este código es abrirme en pantalla mi archivo zip y yo no quiero eso, quiero que te de la oportunidad, de abrir o guardar...

Perl:
$archivo= "/home/ciudadano/web/documentos/$in{'nombrezip'}.zip";

    if (open(PIN, "<$archivo")) {
        print STDOUT "Content-Type:application/zip\n\n";
               my $buf;
               my $num_bytes = 0;
               binmode(PIN);
              binmode(STDOUT);
              while (read(PIN, $buf, 1024) > 0) {
                           print STDOUT $buf;
                          $num_bytes += length($buf);
                       }
             close(PIN);
           }


¡¡¡Espero me puedan ayudar, gracias!!!
Mensaje Jue May 22, 2008 2:29 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

Un ejemplo:

Perl:
#!/usr/bin/perl

$nombre_fichero = 'ws.zip';

open    IMG, "<$nombre_fichero";
binmode IMG;
read    IMG, $fichero -s $nombre_fichero;
close   IMG;

print qq[Content-Type: application/zip\nContent-Disposition: attachment; filename="$nombre_fichero"\n\n];

binmode STDOUT;

print $fichero;


Lo que hacemos es leer el $nombre_fichero y lo guardamos en $fichero. Luego emitimos la cabecera, que incluye el propio nombre del archivo, con el que queremos que el usuario lo guarde (al menos, como sugerencia). Y finalmente, emitimos el $fichero.

Actualización: Cambiado el ejemplo y añadida la explicación.
Mensaje Vie May 23, 2008 8:52 am
piero66
Perlero Nuevo
Perlero Nuevo
Registrado: 22 May 2008
Mensajes: 34
Responder citando

El siguiente archivo me corrió de maravilla
Perl:
#!/usr/bin/perl

$archivo= "/home/ciudadano/web/documentos/140_TRALUC1.zip";


if (open(PIN, "<$archivo")) {

    print "Content-Type: application/zip\nContent-Disposition: attachment; filename=140_TRALUC1.zip \n\n";

    my $buf;
    my $num_bytes = 0;
    binmode(PIN);
    binmode(STDOUT);
    while (read(PIN, $buf, 1024) > 0) {
        print STDOUT $buf;
        $num_bytes += length($buf);
    }
    close(PIN);
}


El problema que ahora tengo es que necesito implementar ese script para que el archivo sea variable, si envío parámetros, o sea, de esta manera:

https://servidor/cgi-bin/prgmas/admin/envio.cgi?zip=nombrearchivo

me lo respete... yo sé que el código de arriba necesito modificarlo y cuando lo modifico... en vez de darme como consecuencia un archivo, me abre el archivo... pero, lógico: como son imágenes, me pone pura basura en pantalla... no sé si debo cambiar algo en esta línea:

Perl:
print "Content-Type: application/zip\nContent-Disposition: attachment; filename=140_TRALUC1.zip \n\n";


¡No sé si me expliqué!!. U otra:

No sé si yo pueda enviar parámetros y que de alguna manera pueda utilizar este mismo código, pero solo poniendo una línea donde recibiré el nombre del archivo como parámetro...

Gracias.
Mensaje Vie May 23, 2008 9:17 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

Con el módulo CGI, es muy sencillo:

Perl:
#!/usr/bin/perl

use CGI ':standard';

if ( param('zip') ) {

    $nombre_del_fichero = param('zip');

    if ( -e $nombre_del_fichero ) {

        open    IMG, "<$nombre_del_fichero";
        binmode IMG;
        read    IMG, $imagen, -s $nombre_del_fichero;
        close   IMG;

        print header(
            -type       => 'application/zip',
            -attachment => $nombre_del_fichero,
        );
        binmode STDOUT;
        print $imagen;
    }
    else {
        print header, start_html('Error'),p('Error: no se encontró fichero'), end_html;
    }
}
else {
    print header, start_html('Error'),p('Error: no se indicó fichero'), end_html;
}
Mensaje Vie May 23, 2008 10:09 am
piero66
Perlero Nuevo
Perlero Nuevo
Registrado: 22 May 2008
Mensajes: 34
Responder citando

Muchas gracias... ya me creó el archivo.
Ya lo único que necesito hacer es que el archivo tome el nombre del parámetro enviado. ¡¡¡ Gracias !!!
Mensaje Vie May 23, 2008 3:42 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Simplemente añade el parámetro de filename en la cabeza del HTTP que te dio explorer:

Perl:
        print header(
            -type       => 'application/zip',
            -attachment => $nombre_del_fichero,
            -filename   => $nombre_del_fichero
        );



Saludos
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group