Aunque
kidd ya te ha respondido, yo voy a ponerte la solución que el propio módulo CGI comenta en la sección
PROCESSING A FILE UPLOAD FIELD. El método que comenta de usar el propio nombre del fichero como literal para ser usado como gestor de archivo, puede dar avisos en pantalla, sobre todo si usas el
pragma strict. Y problemas de seguridad si el usuario, en lugar de mandar el nombre de un archivo, envía una simple cadena de caracteres. Para el programa, será entonces una cadena de caracteres, y el programa entrará en un bucle sin fin.
El módulo CGI tiene ahora una función que se llama
upload(), para intentar resolver estos problemas, que recibe como argumento el nombre del campo del formulario -en tu caso, "archivo"- y devuelve un objeto de tipo IO::Handle que hace referencia al fichero temporal que
kidd te ha comentado antes.
Para ti, solo tienes que quedarte con la idea de que lo que devuelve upload() es un objeto que te permitirá acceder al fichero que te ha mandado el usuario y poder realizar operaciones de fichero con él.
El proceso entonces queda así:
Using perl Syntax Highlighting
$handle = $query->upload('archivo');
# Si no es un gestor de archivo válido, obtendremos un 'undef'
if (defined $handle) {
# Actualiza el gestor a uno compatible con IO::Handle:
my $io_handle = $handle->handle;
# Ya podemos leer el fichero temporal y copiarlo a su lugar definitivo
# Abrimos el fichero de destino.
# Antes tenemos que haber configurado la variable $destino
open (SALIDA, '>', "/usr/local/web/users/archivero/$destino");
# $buffer temporal para ir pasando poco a poco del temporal al $destino
my $buffer;
# bucle mientras leamos desde $io_handle, en bloques de 1024 bytes, al $buffer
while (my $bytesleidos = $io_handle->read($buffer,1024)) {
# mandamos el contenido del $buffer al fichero $destino
print SALIDA $buffer;
}
# cerramos el fichero de salida (opcional)
close SALIDA;
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
En la sección del módulo CGI se comentan más casos, como cómo obtener más información del fichero que nos mandan (tamaño, nombre, tipo MIME, etc.), cómo responder a casos extremos (parada de envío del fichero si el usuario pulsa el botón de parada en el navegador), o cómo crear barras de progreso, o cómo gestionar la subida de múltiples ficheros de una sola vez.