Jue May 22, 2008 11:41 am
|
 |
piero66
Perlero Nuevo

|
Registrado: 22 May 2008
Mensajes: 34
|
|
| Que una URL te dé como consecuencia un archivo ZIP |
|
|
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!!! |
|
|
|

Jue May 22, 2008 2:29 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Vie May 23, 2008 8:52 am
|
 |
piero66
Perlero Nuevo

|
Registrado: 22 May 2008
Mensajes: 34
|
|
|
|
|
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. |
|

Vie May 23, 2008 9:17 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
|
|
|
|
|
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;
} |
|
|
Vie May 23, 2008 10:09 am
|
 |
piero66
Perlero Nuevo

|
Registrado: 22 May 2008
Mensajes: 34
|
|
|
|
|
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 !!! |
|
Vie May 23, 2008 3:42 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
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 |
|
Powered by phpBB © 2001, 2005 phpBB Group
|