• Publicidad

Enviar los datos de un formulario HTML con archivo adjunto

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Enviar los datos de un formulario HTML con archivo adjunto

Notapor meri20 » 2011-02-02 11:26 @518

Buenas,

necesito ayuda en la creación de un script de envío de datos de un formulario vía mail.

Os comento: tengo un formulario HTML en mi web, a través del cual los usuarios pueden contactar conmigo y enviarme un archivo adjunto (puede ser de cualquier tipo) entre otros datos. Este formulario se comunica con un .pl que recoge todos los datos y debe enviármelos por correo (incluido el archivo adjunto).

Estoy haciendo uso del Mime::Lite. No obstante no hay forma de que me llegue el archivo que adjuntan. ¿Es necesario subir físicamente el archivo al servidor donde se ejecuta el .pl?

A ver si me podéis ayudar. Gracias.
meri20
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 3
Registrado: 2011-02-02 11:17 @512

Publicidad

Re: Enviar los datos de un formulario HTML con archivo adjunto

Notapor explorer » 2011-02-02 11:38 @526

Bienvenido a los foros de Perl en Español, meri20.

Efectivamente: el adjunto, con el resto de los datos del formulario es enviado al servidor al que pertenece el formulario (o, más exactamente, a donde el atributo action del formulario haya indicado).

Una vez arriba, solo tienes que crear un mensaje, adjuntar el archivo, y mandártelo.

Con el método attach() del módulo MIME::Lite puedes adjuntarlo. Pero... parece que el problema está antes, en la recepción del fichero.

Si nos dices cómo lo estás haciendo, podríamos tener más pistas.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12781
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Enviar los datos de un formulario HTML con archivo adjunto

Notapor meri20 » 2011-02-02 11:44 @530

En el action de mi formulario no tengo nada, pues llamo vía AJAX a una página HTML que se comunica directamente con el .pl pasándole los datos que tiene que enviar. ¿Hay alguna manera de indicar dónde debe subir el archivo a mi servidor?

Gracias por su respuesta.
meri20
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 3
Registrado: 2011-02-02 11:17 @512

Re: Enviar los datos de un formulario HTML con archivo adjunto

Notapor explorer » 2011-02-02 12:33 @565

Eso depende de lo que pueda hacer el .pl, que no sabemos cuál es, por lo que es difícil dar una solución.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12781
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Enviar los datos de un formulario HTML con archivo adjunto

Notapor meri20 » 2011-02-03 06:28 @311

A continuación te indico cómo lo tengo estructurado:

Formulario HTML:

<form id="mailform" action="" ENCTYPE="multipart/form-data" method="post" >

<input type="hidden" class="text" id="mailTo" value="cuenta@correo.com" readonly>

<table border="0">

<tr>
<td>Email*</td>
<td><input class="itext" type="text" name="email" id="email" /></td>
</tr>

<tr>
<td>Asunto*</td>
<td><input name="asunto" type="text" class="itextarea" id="asunto" value="" /></td>
</tr>

<tr>
<td>Mensaje*</td>
<td> <textarea class="itextarea" name="comentarios" id="comentarios"></textarea></td>
</tr>

<tr>
<td>Archivo adjunto*</td>
<td><input name="archivo" id="archivo" type="file" size="40" /></td>
</tr>


<tr>
<td colspan="2"><input type=button onclick="checkFields();" name=Enviar value="Enviar"></td>
</tr>
</table>

</form>



La función JS checkFields realiza las validaciones y llama por AJAX a una página html con los valores del formulario:
ESta página html, llama a contacto.pl pasando las variables que éste necesita.


contacto.pl

use MIME::Lite;

use Net::POP3;

my $asun = "$ARGV[0]";
my $to = "$ARGV[1]";
my $from = "$ARGV[2]"."@"."$ARGV[3]";
my $mensa = "$ARGV[4]";
my $archivo = "$ARGV[5]";


#Directorio donde queremos estacionar los archivos
my $dir = "/ficheros";


##### CONEXION POP AUTENTIFICADA

$pop = Net::POP3->new('miservidor.mail.com');

if ($pop->login('correo@servidor.com','xxxx') > 0)
{
print "va....\n";
}
else
{
print "no va...\n";
}

$pop->quit();

##### FIN CONEXION POP AUTENTIFICADA


$mime_msg = MIME::Lite->new(
From => $from,
To => $to,
Subject => $asun,
Type =>'multipart/mixed'
);

$mime_msg->attach(
Type => 'text/html',
Data => $mensa

);


##### ENVIO SMTP

$mime_msg -> send('smtp', 'miservidor.mail.com', AuthUser=>'correo@servidor.com', AuthPass=>'xxxx',Timeout=>60 );



Necesito subir el archivo adjunto al servidor linux, para después enviarlo también como adjunto en el correo. Si el archivo está en C:, pues al .pl le llega $archivo='C:\nomarchivo.txt'. No sé qué estoy haciendo mal, pero necesito hacer el upload al servidor (no lo consigo) y después enviarlo.
meri20
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 3
Registrado: 2011-02-02 11:17 @512

Re: Enviar los datos de un formulario HTML con archivo adjun

Notapor explorer » 2011-02-03 06:57 @331

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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <form action="/~danicris/cgi-bin/foto.cgi" method="post" enctype="multipart/form-data">
  2. <p><label for="foto">Selecciona la foto que quieres subir, desde tu ordenador: </label></p>
  3. <p><input name="foto" size="50" type="file" id="foto"></p>
  4. <p><label for="seccion">Elegir la sección: </label>
  5. <SELECT NAME="seccion" id="seccion">
  6. <OPTION value="novios">Los novios</OPTION>
  7. <OPTION value="cris">Despedida de Cris</OPTION>
  8. <OPTION value="dani">Despedida de Dani</OPTION>
  9. <OPTION selected value="celebracion">La celebración</OPTION>
  10. <OPTION value="viaje">Viaje de novios</OPTION>
  11. </SELECT></p>
  12. <p><label for="nombre">Tu nombre: <input type="text" name="nombre" id="nombre"></label></p>
  13. <p><small><em>Pulsa el botón una sola vez, y espera a que termine de subir la foto. <br />
  14. El tiempo de espera dependerá del tamaño de la foto y de tu conexión a Internet.</em></small><br /><br />
  15. <INPUT TYPE="submit" VALUE="Subir" onclick="this.disabled=true; this.form.submit()"></p>
  16. </form>
Coloreado en 0.010 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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use CGI                         ':standard';
  4. use File::Slurp;
  5.  
  6. my $cgi = CGI->new;
  7.  
  8. ## Parámetros
  9. my $fichero = $cgi->param('foto');                      # nombre del fichero
  10. my $nombre  = $cgi->param('nombre')  // 'desconocido';  # resto de parámetros
  11. my $seccion = $cgi->param('seccion') // 'celebracion';
  12.  
  13. if ($fichero) {       # si hay un nombre de fichero, es que se ha recibido bien
  14.                       # si no, el usuario cortó la comunicación
  15.     my $fh = $cgi->upload('foto');         # handle hacia el fichero
  16.                                            # CGI guardó el adjunto en ese fichero temporal
  17.     if ($fh) {                                          # El handle está definido si el temporal se grabó bien
  18.  
  19.         my $imagen = read_file( $fh, binmode => ':raw' ) ;    # leemos todo el fichero, a memoria, en modo crudo
  20.         ...;                                                  # procesamos el fichero
  21.         ...;                                                  # lo guardamos o lo borramos
  22.     }
  23. }
Coloreado en 0.009 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.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12781
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Enviar los datos de un formulario HTML con archivo adjunto

Notapor danimera » 2011-02-03 13:10 @590

:? No estoy muy seguro si por Ajax se puedan subir archivos así de forma convencional...

Lo que sí es seguro es que tienes que hacer el envió del archivo por medio del formulario vía POST y con enctype="multipart/form-data" en los parámetros del formulario.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Vive para Perl en Español
Vive para Perl en Español
 
Mensajes: 768
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Enviar los datos de un formulario HTML con archivo adjunto

Notapor explorer » 2011-02-04 06:57 @331

Ajax intercambia información HTML o XML con el servidor, para actualizar las páginas o informar al servidor de lo que está haciendo el usuario, y responder casi inmediatamente.

Lo que sí se suele hacer es lanzar el proceso de subida, de la forma clásica, y al mismo tiempo hay un Ajax que, periódicamente, pregunta al servidor cuánto del fichero ha subido, para actualizar la barra de progreso.

No sé, técnicas hay muchas. Quizás sí se pueda hacer.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12781
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron