Pues yo creo que el ejemplo del
tutorial está mal. Las quejas, a kidd.
En cuanto a los ficheros: tienen tamaño cero porque ese es el efecto del open().
Lo que está fallando es el read().
Es recomendable mirar la sección
PROCESSING A FILE UPLOAD FIELD del módulo CGI, que explica todas las posibilidades que el módulo da para subir ficheros.
Editado Te pongo los pasos básicos (sacado del último programa que he hecho. Faltan muchas líneas, solo están las interesantes):
Using perl Syntax Highlighting
use CGI ':standard';
use File::Slurp;
my $cgi = CGI->new;
my $fichero = $cgi->param('foto'); # param() nos da el nombre completo del fichero
if ($fichero and chdir $directorio) { # si el usuario nos pasó un fichero y podemos entrar en $directorio
my $fh = $cgi->upload('foto'); # obtenemos el controlador de acceso al fichero en el fichero subido
if ($fh) { # si podemos leerlo...
my $imagen = read_file( $fh, binmode => ':raw' ) ; # nos lo leemos a memoria (somos muy chulos :)
my $foto = 'foto001'; # creamos un nombre nuevo para la foto
++$foto while -e "$foto.jpg"; # buscamos un nombre que todavía no exista
my $foto_org = "${foto}_org.jpg"; # la foto original la guardaremos con .org al final
$foto .= '.jpg'; # la foto resultado será jpeg
# grabamos la $imagen a disco, con nombre $foto_org
write_file( $foto_org, {binmode => ':raw'}, $imagen );
# Informar al usuario
say $cgi->header,
$cgi->start_html('Foto recibida'),
$cgi->h2('Foto recibida'),
$cgi->p("¡¡¡Gracias por el envío, $nombre!!!"),
$cgi->hr,
$cgi->pre($salida),
$cgi->end_html,
;
}
}