Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Avanzado » Enviar los datos de un formulario HTML con archivo adjunto Responder al tema
Nuevo tema


Página 1 de 1  [ 8 mensajes ] 
 
Nota 2011-02-02 11:26 @518

Perlero Nuevo
Registrado: 2011-02-02 11:17 @512
Mensajes: 3
Enviar los datos de un formulario HTML con archivo adjunto
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.


Nota 2011-02-02 11:38 @526
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Enviar los datos de un formulario HTML con archivo adjunto
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


Nota 2011-02-02 11:44 @530

Perlero Nuevo
Registrado: 2011-02-02 11:17 @512
Mensajes: 3
Re: Enviar los datos de un formulario HTML con archivo adjunto
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.


Nota 2011-02-02 12:33 @565
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Enviar los datos de un formulario HTML con archivo adjunto
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


Nota 2011-02-03 06:28 @311

Perlero Nuevo
Registrado: 2011-02-02 11:17 @512
Mensajes: 3
Re: Enviar los datos de un formulario HTML con archivo adjunto
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.


Nota 2011-02-03 06:57 @331
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Enviar los datos de un formulario HTML con archivo adjunto
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:
Syntax: [ Download ] [ Hide ]
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>

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:
Syntax: [ Download ] [ Hide ]
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. }


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 nada que recibe el nombre del fichero, pero no su contenido.

_________________
JF^D Perl programming


Nota 2011-02-03 13:10 @590
Avatar de Usuario
Vive para Perl en Español
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia
Mensajes: 551
Re: Enviar los datos de un formulario HTML con archivo adjunto
:? 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


Nota 2011-02-04 06:57 @331
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Enviar los datos de un formulario HTML con archivo adjunto
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


Responder al tema  [ 8 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO