Es decir: que el html intermedio llama a contacto.pl pasándole sólo el nombre del fichero... por lo que entonces NO está subiendo el fichero al servidor.
Para realizar la operación de subida, se debe crear una conexión HTTP de tipo POST, en que los datos de un formulario han de ser codificados en formato "multipart/form-data". Mira un ejemplo:
Using html4strict Syntax Highlighting
<form action="/~danicris/cgi-bin/foto.cgi" method="post" enctype="multipart/form-data">
<p><label for="foto">Selecciona la foto que quieres subir, desde tu ordenador: </label></p>
<p><input name="foto" size="50" type="file" id="foto"></p>
<p><label for="seccion">Elegir la sección: </label>
<SELECT NAME="seccion" id="seccion">
<OPTION value="novios">Los novios</OPTION>
<OPTION value="cris">Despedida de Cris</OPTION>
<OPTION value="dani">Despedida de Dani</OPTION>
<OPTION selected value="celebracion">La celebración</OPTION>
<OPTION value="viaje">Viaje de novios</OPTION>
</SELECT></p>
<p><label for="nombre">Tu nombre: <input type="text" name="nombre" id="nombre"></label></p>
<p><small><em>Pulsa el botón una sola vez, y espera a que termine de subir la foto. <br />
El tiempo de espera dependerá del tamaño de la foto y de tu conexión a Internet.</em></small><br /><br />
<INPUT TYPE="submit" VALUE="Subir" onclick="this.disabled=true; this.form.submit()"></p>
</form>
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
El
action indica qué programa recibirá los datos, por la entrada estándar.
En Perl, con el módulo CGI, recibirá esos datos. Esto es un extracto del último programa que he hecho para recoger ficheros desde la web:
Using perl Syntax Highlighting
#!/usr/bin/perl
use 5.010;
use CGI ':standard';
use File::Slurp;
my $cgi = CGI->new;
## Parámetros
my $fichero = $cgi->param('foto'); # nombre del fichero
my $nombre = $cgi->param('nombre') // 'desconocido'; # resto de parámetros
my $seccion = $cgi->param('seccion') // 'celebracion';
if ($fichero) { # si hay un nombre de fichero, es que se ha recibido bien
# si no, el usuario cortó la comunicación
my $fh = $cgi->upload('foto'); # handle hacia el fichero
# CGI guardó el adjunto en ese fichero temporal
if ($fh) { # El handle está definido si el temporal se grabó bien
my $imagen = read_file( $fh, binmode => ':raw' ) ; # leemos todo el fichero, a memoria, en modo crudo
...; # procesamos el fichero
...; # lo guardamos o lo borramos
}
}
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4
El nombre del fichero que nos manda el usuario no nos interesa porque es relativo al disco duro del usuario. Podríamos quedarnos con el nombre real del fichero extrayéndolo con File::Basename u obteniendo más información llamando a $cgi->uploadInfo(), que devuelve la cabecera HTTP completa.
Como ves, el uso de CGI ayuda bastante. Si no lo usáramos, tendríamos que leer toda la entrada estándar, tanto los parámetros normales del formulario como todo el flujo que compone el fichero.
En tu programa solo veo que recibe el nombre del fichero, pero no su contenido.