PDA

Ver la Versión Completa : archivo en formulario php


elcigarra
18-09-2006, 13:16:07
Tengo un formulario en php que llega al usuario en mi página web. En este formulario hay un cuadro de texto donde el puede ingresar la dirección de un archivo en su disco duro. Todo el formulario es ingresado por mail con la funcion mail().

¿Es posible que en el mail cuando se remite el formulario venga adjunto el archivo que seleccionó el usuario en su pc?. ¿Como se hace eso?

dec
18-09-2006, 14:39:08
Hola,

Vayamos por partes, como dijo Jack el destripador... :)


Tengo un formulario en php que llega al usuario en mi página web.


¿Es el usuario quien llega a tu página Web? ¿El que llega es el formulario? Bueno. Yo entiendo que en tu página Web tienes un formulario desde el que un usuario puede indicarte la ruta de un archivo en su ordenador.


En este formulario hay un cuadro de texto donde el puede ingresar la dirección de un archivo en su disco duro.


No estoy completamente seguro, pero, en estos casos, para que PHP pueda "hacerse" con el archivo en cuestión, es necesario que el cuadro de texto, el elemento "input" del formulario sea del tipo "file". Ignoro si con la ruta de un archivo, propiamente, podrías conseguir tu objetivo, pero, me parece que no sería posible.


Todo el formulario es ingresado por mail con la funcion mail().


Esto no lo entiendo. Tú puedes enviar por correo el código HTML de un formulario, pero, este habrá de procesarse en el Servidor, es decir, el usuario podrá enviar el formulario (si esto es posible en su Gestor de correo, que yo no lo sé) y el formulario se procesará en el Servidor, nunca en el cliente, para subir archivos por lo menos...


¿Es posible que en el mail cuando se remite el formulario venga adjunto el archivo que seleccionó el usuario en su pc?. ¿Como se hace eso?


Non sense in basic. Quiero decir, ¿qué significa "cuando se remite el formulario"? El formulario se ha de procesar en el Servidor, no se "remite" a ningún sitio... puede hacerse llegar el formulario (su código HTML) al cliente, pero, este siempre lo enviará al Servidor a que lo procese.

La verdad. A bote pronto no me parece descabellado enviar mediante correo un formulario al usuario que le permitiera seleccionar un archivo de su disco duro y enviarlo al Servidor. En la página Web de PHP se detalla pormenorizadamente cómo trabajar con archivos "enviados" desde formularios en el artículo "PHP - Manejo de envío de archivos" (http://es2.php.net/manual/es/features.file-upload.php).

Sin embargo, me huelo problemas con los Gestores de correo, y con algunos usuarios: personalmente, no recibo correo en formato HTML, por lo que nunca vería el formulario que me enviaras... así que, me parece, no estaría demás que el formulario de marras estuviera disponible en alguna URL, esto es, pudiera dirigirse allí al usuario para que enviara el archivo desde allí.

No sé si te he ayudado en algo o no... :)

elcigarra
20-09-2006, 04:46:40
Bueno, entendí. La próxima vez no escribiré tan apurado y tal vez me entiendan mejor. En realidad encontré lo ue quería en internet. Les paso el código para el que necesite hacer lo mismo. Solo tienen que ajustarlo a sus necesidades. El asunto será "Mandar un formulario por mail con un archivo adjunto"

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Envio de correo con un archivo adjunto</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
if ($_SERVER['REQUEST_METHOD']=="POST"){
// we'll begin by assigning the To address and message subject
// $to="nombredeldestinatario@correo.com";
$to=$_POST['acorreo'];
//$subject="E-mail with attachment";
$subject=$_POST['asunto'];
// get the sender's name and email address
// we'll just plug them a variable to be used later
$from = stripslashes($_POST['fromname'])."<".stripslashes($_POST['fromemail']).">";
// generate a random string to be used as the boundary marker
$mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x";
// store the file information to variables for easier access
$tmp_name = $_FILES['filename']['tmp_name'];
$type = $_FILES['filename']['type'];
$name = $_FILES['filename']['name'];
$size = $_FILES['filename']['size'];
// here we'll hard code a text messge
// again, in reality, you'll normally get this from the form submission
// $message = "Here is your file: $name";
$message = $_POST['mensaje'];
// if the upload succeded, the file will exist
if (file_exists($tmp_name)){
// check to make sure that it is an uploaded file and not a system file
if(is_uploaded_file($tmp_name)){
// open the file for a binary read
$file = fopen($tmp_name,'rb');
// read the file content into a variable
$data = fread($file,filesize($tmp_name));
// close the file
fclose($file);
// now we encode it and split it into acceptable length lines
$data = chunk_split(base64_encode($data));
}
// now we'll build the message headers
$headers = "From: $from\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-Type: multipart/mixed;\r\n" .
" boundary=\"{$mime_boundary}\"";
// next, we'll build the message body
// note that we insert two dashes in front of the
// MIME boundary when we use it
$message = "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$message . "\n\n";
// now we'll insert a boundary to indicate we're starting the attachment
// we have to specify the content type, file name, and disposition as
// an attachment, then add the file content and set another boundary to
// indicate that the end of the file has been reached
$message .= "--{$mime_boundary}\n" .
"Content-Type: {$type};\n" .
" name=\"{$name}\"\n" .
//"Content-Disposition: attachment;\n" .
//" filename=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . "\n\n" .
"--{$mime_boundary}--\n";
// now we just send the message
if (@mail($to, $subject, $message, $headers)) {

echo "Correo enviado<br>";
echo "<a href='http://pio9.com/22php.htm'>http://pio9.com/22php.htm</a><br>";
}
else
echo "Fallo en el envío";
}
} else {
?>
<p><b><center>Envío de un correo con un archivo adjunto:</center></b></p>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"
enctype="multipart/form-data" name="form1">
<p>Nombre del que envia..... <input type="text" name="fromname" size="25"></p>
<p>Correo del que envia....... <input type="text" name="fromemail" size="25"></p>
<p>Correo del destinatario.... <input type="text" name="acorreo" size="25"></p>
<p>Asunto............................ <input type="text" name="asunto" size="25"></p>
<p>Mensaje: <textarea name="mensaje" cols="50" rows="5"></textarea></p>
<p>Archivo a enviar: <input type="file" name="filename"></p>
<p><input type="submit" name="Submit" value="Enviar"></p>
</form>
<?php } ?>
</body>
</html>