Foros del Web » Programando para Internet » PHP »

¿enviar un archivo con un formulario?

Estas en el tema de ¿enviar un archivo con un formulario? en el foro de PHP en Foros del Web. Hola a todos. Bueno lo primero decir que no sé si estoy en el foro adecuado porque no sé exactamente con qué lenguaje se hace ...
  #1 (permalink)  
Antiguo 27/10/2006, 19:04
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Pregunta ¿enviar un archivo con un formulario?

Hola a todos.

Bueno lo primero decir que no sé si estoy en el foro adecuado porque no sé exactamente con qué lenguaje se hace lo que quiero, suponiendo que se pueda.

El caso es que tengo un formulario que incluye un <input type="file">, entre otros datos, y quisiera que cuando el formulario se envía, todos esos datos me fueran enviados al mail con el archivo indicado en el input como adjunto.

Hasta donde yo sé, los datos de un formulario se pueden enviar a un mail con mailto, pero he leido en el subforo de html que así no se puede enviar un archivo, así que después de mucho leer, romperme la cabeza y seguir igual de perdida me he decidido a preguntar aquí porque algo me dice que va a tener que ser con php, pero como de este lenguaje sé solo lo básico pues...

Espero que puedan ayudarme. Muchas gracias por adelantado

P.D. ¿Por qué la búsqueda no funciona? O me devuelve una página en blanco o me dice que introduzca valores validos, y lo único que introduzco son palabras tipo "archivo" "correo" "adjunto" "formulario"...
  #2 (permalink)  
Antiguo 28/10/2006, 21:14
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Si hablas de "HTML" y "mailto" .. Seguro que quieres hacer este proceso con PHP? .. dispones de PHP en tus servidores? ...

Bueno, suponiendo que así sea. Te hace falta para el tema los siguientes ingredientes:

0) Que tal andas de conocimientos de PHP en general? .. son necesarios unos "minimos" para que entiendas o apliques los siguientes puntos que voy a mencionar.

1) Subir el archivo al servidor y que lo procese PHP. Esto lo haces como indica la documentación de PHP:

http://www.php.net/manual/es/features.file-upload.php

2) Componer el e-mail con los datos del formulario y el archivo adjunto .. Para esto te puedes ayudar de la excelente classe:

PHPMailer
http://phpmailer.sourceforge.net

Y listo .. eso es lo que necesiteas .. combinado eso sí .. El archivo que subistes lo tomas con el método de PHPMailer que corresponda (en sus tutoriales y documentación tienes ejemplos) y así generas un e-mail listo para enviar con tus datos del formulario y el archivo adjunto. Todo dependerá si tu proveedor de hosting te dá soporte a mail() de PHP .. o que tu tengas una cuenta de correo con acceso SMTP que puedas indicar en PHPMailer (pues PHPMailer puede enviar un e-mail de tres formas: usando la función de PHP mail() y recursos de tu servicio de hosting/servidor .. por SMTP directo (indicando tu el servidor SMTP a usar) .. o por sendmail (si tienes instalado ese MTA en tus servidores).

Un saludo,

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 30/10/2006, 16:49
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Hola Cluster. Muchas gracias por tu información. Voy a revisar todo a ver si consigo hacerlo.

Conocimientos de php?? pues poquitos, la verdad, ese es el problema. Quise recoger todos los datos con bases de datos, pero acabé haciendome tal lio con las cosas que debía comprobar con javascript y las que tenía que comprobar en la base de datos que decidí probar de otra forma.
Hace un par de meses para probarlo hice un pequeño programita con bases de datos y me fue bastante bien, pero lo del envío de archivos como que ando más perdida... A ver si me encuentro un manual decente y que utilice php combinado con javascript, no aislado, que a la hora de la verdad creo que es como se utiliza para comprobar datos.

En cuanto a lo que mencionas del tipo de servidor de mail... Por ahora no tengo servidor para la página, primero quiero ver que salga :P pensaba utilizar un correo tipo yahoo o gmail, que tienen bastante capacidad. Cuando configuro estos en el outlook, pongo un servidor SMTP para recibir mis mensajes ¿es ese al que te refieres verdad? que me acabo de acongojar...

Muchas gracias por tu respuesta. Saludos
  #4 (permalink)  
Antiguo 30/10/2006, 17:04
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
El servidor de e-mail o mejor dicho el "MTA" a usar ya te lo proporcionará tu proveedor actual de servicio de hosting. (todos lo incluyen) ..

Tu sólo usa PHPMailer y donde dice se configura tu servidor SMTP usa el que dispongas. Si en tu domino (hosting) tienes cuentas de e-mail .. usa los mismos datos del servidor SMTP que te han dado ya para configurar tus cuentas de correo en clientes de correo tipo "Outlook". Y si esto no lo sabes, pregunta a tu proveedor si te prestan ese servicio.

Usar el servidor SMTP de "gmail" por ejemplo requiere unos cambios en PHPMailer .. el de otros servicios de e-mail no sé como serán .. puedes probarlos.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 31/10/2006, 11:01
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Ok.
Ayer estuve leyendo un poco sobre phpMailer y espero poder probarlo hoy en la tarde. Ojalá que me entienda bien con todo eso y pueda hacer mi formulario. Cruzo los dedos.
Muchas gracias por tu ayuda, Cluster
  #6 (permalink)  
Antiguo 31/10/2006, 14:55
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Hola otra vez.

Al fin estuve probando phpMailer. Y me pasa algo realmente curioso que no sé como se soluciona

Resulta que hice un pequeño formulario de prueba donde pido el nombre, la dirección de correo y un archivo.
Cuando envío el formulario voy a un nuevo archivo php donde hago el envío del correo electrónico a mi dirección, con el campo FROM con la dirección que hayan puesto en el formulario y el archivo que han indicado como adjunto.

Hice varias pruebas hasta que conseguí que funcionara, pero ahora me sale esto en la página resultado:

Warning: fputs(): supplied argument is not a valid stream resource in C:\Servidor\WEB\restauraciones\class.smtp.php on line 146

Warning: fgets(): supplied argument is not a valid stream resource in C:\Servidor\WEB\restauraciones\class.smtp.php on line 1024


pero el e-mail se envía correctamente con todos los datos y el archivo adjunto y bajo esos dos errores sale el texto que yo hice para envíos correctos... que está mal??? Porque se supone que sobre class.smtp.php no debo tocar nada no???

Por si sirve de algo, ambas clases (smtp y phpmailer) están junto con los archivos de prueba, en el mismo directorio.

Muchas gracias por adelantado por cualquier tipo de orientación
  #7 (permalink)  
Antiguo 31/10/2006, 15:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pon mejor el código completo que usasates (tu fomulario y demás scripts que intervengan en el proceso.

No se vé que método usas para tomar tu archivo ni como lo usas en el método concreto de PHPMailer ni como gestionas la recepción del archivo en el script PHP.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #8 (permalink)  
Antiguo 31/10/2006, 15:14
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Ah perdón...

Formulario:
Código HTML:
 <FORM ACTION="prueba2.php" METHOD="post" ENCTYPE="multipart/form-data">
		Nombre: <INPUT TYPE="text" NAME="nombre"><BR>
		Mail: <INPUT TYPE="text" NAME="mail"><BR>
		Archivo a enviar: <INPUT TYPE="file" NAME="archivo"><BR>
		<INPUT TYPE="submit">
	</FORM> 
Archivo que recepciona el formulario (prueba2.php):

Código PHP:
    <?
        $nombre
=$_POST["nombre"];
        
$email=$_POST["mail"];
        
$archivo=$_FILES["archivo"]["tmp_name"];

        require(
"class.phpmailer.php");
        
$mail = new PHPMailer();

        
$mail->Mailer "smtp";
        
$mail->Host"servidor.smtp";
        
$mail->SMTPAuthtrue;
        
$mail->Username="direcció[email protected]";
        
$mail->Password="contraseña";
        
$mail->From=$email;
        
$mail->FromName=$nombre;
        
$mail->Timeout=120;
        
$mail->AddAddress("direcció[email protected]");
        
$mail->Subject="Prueba";
        
$mail->Body=$nombre.' Envía un correo desde esta dirección: '.$email;
        if (
$archivo!=none){
            
$mail->AddAttachment($archivo,$archivo_name);
        }
        
$exito=$mail->Send();
        
$intentos=1;
        while((!
$exito)&&($intentos<5)){
            
sleep(5);
            
$exito=$mail->Send();
            
$intentos=$intentos+1;
        }

        if(!
$exito){
            echo 
"Problemas enviando mensaje. Intentelo de nuevo";
            echo 
"<br>".$mail->ErrorInfo;
        }
        else{
            echo 
"mensaje enviado correctamente";
        }
    
?>
Ambos códigos son lo único que se encuentra en el BODY del archivo.

Aunque lo gracioso viene ahora... sin cambiar nada de nada, me ha dado por volver a probar un par de veces y unas veces salen esos errores y otras no

También he intentado hacerlo funcionar en un servidor gratuito de lycos (hasta ahora probaba en local) y cuando cargo el formulario me sale en la barra de estado un icono de error de javascript indicando que en la línea 81 se esperaba un objeto (Si uso ver codigo fuente, lo que sale no tiene nada que ver con lo que yo he escrito, claro)
Al enviar el formulario, prueba2 se queda en blanco y no se envia nada :(

Última edición por atribis; 31/10/2006 a las 17:04 Razón: Aumentar información
  #9 (permalink)  
Antiguo 31/10/2006, 18:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Donde le das valor a:
$archivo_name

Por lo demás .. no digas "ambos códigos están en el "BODY" .. " tu estás programando en PHP no en "HTML con incrustraciones de PHP" .. el concepto es diferente.

Las pruebas que hagas en servicios de hosting gratuitos es "normal" que no te puedan funcionar o dar errores de lo más inesperados. Este tipo de servicios tiene altamente restringidos muchos procesos, por ejemplo .. el hecho de acceder directamente al archivo en "$_FILES['archivo']['tmp_name']" para usar el método de PHPMailer AddAttachment() .. no en todo servicio de hosting o mejor dicho configuración de PHP te va a funcionar.

Normalmente por un tema de restricciones y seguridad, tendrás que llevarte tu archivo con la única función que está permitida para acceder al archivo "temporal": move_uploaded_file() a un directorio de tu sitio .. de ahí lo podrás tomar con el método de PHPMailer correspondiente y una vez enviado el e-mail si no necesitas ese archivo "temporal" que tendrás en tu directorio de tu sitio ..te deshaces de el con unlink()

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 01/11/2006, 09:35
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Hola Cluster. De nuevo muchas gracias por la información que me das

Tienes razón... en algún momento me comí la línea donde daba valor a $archivo_name.
Recuerdo haber escrito esto: $archivo_name=basename($archivo) para extraer sólo el nombre del archivo, sin ningún path, pero ni siquiera sé si está bien echo porque no entiendo muy bien para que es ese parámetro de la función, solo que si no lo pongo no funciona

Lo de los archivos en hostings gratuitos voy a intentar hacerlo como tú me dices. Es que por ahora ni si quiera sé si me voy a poder permitir uno de pago, la verdad y eso suponiend que la página funciene Aunque eso ya son otras historias.

De nuevo muchas gracias, tus consejos me están siendo de gran ayuda. Saludos
  #11 (permalink)  
Antiguo 01/11/2006, 10:24
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Tienes razón... en algún momento me comí la línea donde daba valor a $archivo_name.
Recuerdo haber escrito esto: $archivo_name=basename($archivo) para extraer sólo el nombre del archivo, sin ningún path, pero ni siquiera sé si está bien echo porque no entiendo muy bien para que es ese parámetro de la función, solo que si no lo pongo no funciona
Si no entiendes que hace ese parámetro en ese método .. sólo tienes que leer la documentación extensa que PHPMailer dispone y ver que parámetros acepta y que son:

http://phpmailer.sourceforge.net/doc...#AddAttachment

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #12 (permalink)  
Antiguo 01/11/2006, 15:11
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Hola Cluster. Muchas gracias.
Ya vi en esa página el día que me indicaste phpMailer, pero mi inglés está tan oxidado como mi japones :S pero weno... algo iré sacando

La duda que me suge ahora (y siento mucho ser tan pesada, de verdad ) es como hago para referirme al archivo suvido una vez que he utilizado move_uploaded_file()

Es decir, yo entiendo (que claro, dista mucho de que sea así) que tengo que hacer esto:
Código PHP:
move_uploaded_file($_FILE["archivo"]["tmp_name"],"/archivos"
para mover el archivo que acabo de subir a una carpeta "archivos" dentro del raíz de mi sitio.
Pero... de ahi, como hago que $archivo, la variable que utilizo para enviar el mail, sea igual a ese archivo?? (y creo que no me estoy expresando bien, pero a ver si lo soluciono)

Es decir, no puedo hacer
Código PHP:
$archivo=move_uploaded_file($_FILE["archivo"]["tmp_name"],"/archivos"
porque entonces lo que estaría enviando en mi mail sería un verdadero o falso, no un archivo. Pero tampoco sé como se llama el archivo que se acaba de subir, así que tampoco puedo hacer
Código PHP:
$archivo="/archivos/algo.algo"
¿cómo hago para referirme a esa archivo que acabo de mover a mi carpeta archivos para la acción que sea?

He visto aquí http: //www .php.net/manual/es/function.move-uploaded-file.php pero no me ha solucionado gran cosa

Gracias otra vez y siento mucho tantas molestias
  #13 (permalink)  
Antiguo 30/11/2006, 10:48
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Cita:
Iniciado por Cluster Ver Mensaje

Usar el servidor SMTP de "gmail" por ejemplo requiere unos cambios en PHPMailer .. el de otros servicios de e-mail no sé como serán .. puedes probarlos.

Un saludo,
Hola después de mucho mucho tiempo. Necesitaría saber cuales son esos cambios, si fuera posible. ¿Puedes indicarme donde puedo encontrar esa información?

Gracias
  #14 (permalink)  
Antiguo 30/11/2006, 10:52
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por atribis Ver Mensaje
Hola después de mucho mucho tiempo. Necesitaría saber cuales son esos cambios, si fuera posible. ¿Puedes indicarme donde puedo encontrar esa información?

Gracias
los cambios para usar Gmail o cualquier cuenta de e-mail que use autentificación por SSL/TLS son:

http://www.buayacorp.com/archivos/phpmailer-con-gmail/

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #15 (permalink)  
Antiguo 30/11/2006, 11:17
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Vaya que rapidez!!!
Justo entraba a comentar que había encontrado información y me encuentro con el mismo enlace. Muchas gracias Cluster :)
Solo que me ha surgido un problema más. He realizado esos cambios y ahora no me da error, pero tampoco llego a recibir nunca el correo.
No hay que hacer nada más que cambiar ese if¿¿ :S
Gracias de nuevo :)
  #16 (permalink)  
Antiguo 30/11/2006, 11:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por atribis Ver Mensaje
Vaya que rapidez!!!
Justo entraba a comentar que había encontrado información y me encuentro con el mismo enlace. Muchas gracias Cluster :)
Solo que me ha surgido un problema más. He realizado esos cambios y ahora no me da error, pero tampoco llego a recibir nunca el correo.
No hay que hacer nada más que cambiar ese if¿¿ :S
Gracias de nuevo :)
mm Bueno .. ademas del cambio del código necesitas que tu servidor tenga instalado OpenSSL como ahí mismo en el artículo se menciona ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #17 (permalink)  
Antiguo 30/11/2006, 11:42
 
Fecha de Ingreso: abril-2006
Ubicación: De vuelta en Asturias
Mensajes: 209
Antigüedad: 18 años
Puntos: 1
Tienes razón, ahora lo he visto. Por ahora creo que lo que voy a hacer es utilizar el mismo servidor que utilizaba pero poniendo la dirección de gmail en el From, así las posibles respuestas serán donde se reciban y no me complico tanto la vida.
Muchas gracias por la rapidez y tu ayuda :)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:21.