Comunidad de diseño web y desarrollo en internet online

Cómo adjuntar un archivo PDF a un formulario

Citar            
MensajeEscrito el 27 Oct 2010 08:15 pm
Hola. Necesito adjuntar un PDF a un campo de archivo en un formulario, pero no sé cómo programarlo en el php que tengo para los otros datos del formulario.
He leído varios tutoriales en la web, pero no entiendo como juntar todo, porque soy autodidacta y no sé php. Lo que tengo hecho también lo saqué de un tutorial de php.

Otra cosa que no logro corregir es que los mails de prueba que he hecho, llegan con los acentos y las "eñes" así:

Nombres: Corazón
Apellidos: Generoso
Empresa: Casa
Cargo: Diseñadora
Email: [email protected]
Teléfono: 5555555
Mensaje: Los acentos se ven pésimo.

Les adjunto la página html con el formulario:
http://www.ejemplo.com/LOYAL2010/es/trabaje_es.html

Y el php que lo procesa:

Código PHP :

<?php

/*Subject an Email Variables */

   $emailSubject = 'Formulario de Trabaje con nosotros';
   $webMaster = '[email protected]';
   
/*Gathering Data Variables*/

   $nombres = $_POST['nombres'];
   $apellidos = $_POST['apellidos'];
   $email = $_POST['email'];
   $telefono = $_POST['telefono'];
   $mensaje = $_POST['mensaje'];
   $CV = $_POST['CV'];
   
   $body = <<<EOD
<br><hr><br>
Nombres: $nombres <br>
Apellidos: $apellidos <br>
Email: $email <br>
Tel&eacute;fono: $telefono <br>
Mensaje: $mensaje <br>
CV: $CV <br>
EOD;

   $headers = "From: $email\r\n";
   $headers .= "Content-type: text/html\r\n";
   $success = mail($webMaster, $emailSubject, $body, $headers);
   
/*Results rendered as HTML*/
header (("Location: http://www.ejemplo.com/LOYAL2010/es/gracias_CV_es.html"));
?>


Para cuando se envíe el formulario quiero que se redirija a esta página html:
http://www.ejemplo.com/LOYAL2010/es/gracias_CV_es.html

De antemano muchas gracias por la ayuda. :)

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 28 Oct 2010 01:58 am
Bueno, esto no tiene que ver con HTML sino más bien con PHP.
Primero que nada, no uses la función mail(), suele estar deshabilitada en muchos hostings. Mejor usa PHPMailer (doc) o Swift Mailer (doc) que son componentes para PHP que no solo facilitan armar correos complejos sino que funcionan como auténticos clientes de correo.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 28 Oct 2010 11:48 am
Gracias DriverOp. Los revisaré y veré si entiendo cómo funcionan.

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 30 Oct 2010 05:50 pm
Si hay alguien más que pueda ser más específico en cuanto al código que debo usar, se lo agraceré infinitamente, ya que a pesar de haber revisado los links aportados por DriverOp y haber instaldo Swift Mailer, aún no sé cómo resolverlo porque no sé php.
En cuanto a los acentos y las eñes, ¿dónde debo especficar el charset, en la página html o en el php para que la respuesta que me llega por mail sea legible y cuál charset es el más indicado para español, utf8 ó 8859-1? Además debo publicar el sitio al inglés y en portugués. ¿Usan el mismo charset que el español?
Gracias a todos.

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 31 Oct 2010 01:59 am
El tema del charset es complicado porque intervienen muchos factores y todos deben coincidir entre sí. Pero a grosso modo te diré que si en tu HTML has indicado un charset tipo iso-8859-1, el servidor web debe estar configurado igual. Sin embargo si quieres usar caracteres de tres idiomas, como has dicho, es mejor que pases todo a UTF-8 pero el cliente de correo de quien lee el mensaje de correo debe poder interpretar UTF-8 (todos los clientes de correo modernos lo hacen).

Con Swift Mailer la forma de adjuntar un archivo es así:

Código PHP :

$adjunto = Swift_Attachment::fromPath('camino/al/archivo/imagen.jpg', 'image/jpeg');
$mensaje->attach($adjunto);


Suponiendo que $mensaje es el objeto mensaje que quieres enviar y que ya tienes creado. Aquí están las instrucciones:
http://swiftmailer.org/docs/message-quickref

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 31 Oct 2010 11:36 pm
Gracias nuevamente DriverOp. Lo seguiré intentando, hasta lograrlo.
Aprovecho de preguntarte ¿cómo especifico que el archivo adjunto sea sólo del tipo pdf y de ningún otro tipo de archivo?

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 03 Nov 2010 10:10 pm
Amigos, dado que hay muchas más lecturas que respuestas, después de fundirme el cerebro, he llegado a una solución que funciona. Ustedes pueden darle su estilo propio en una hoja de estilos aparte.
Aquí les adjunto el formulario en html, llamado "Form.html":

Código HTML :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Cómo adjuntar un PDF a un formulario</title>
<style>
#container {
   margin: 0 auto;
   width: 628px;
}
form {
   width:628px;
}
form h3 {
   font-family: Arial, Helvetica, sans-serif;
   font-size: 12px;
   color: #333;
   font-weight: lighter;
   padding: 15px 10px 10px 1.7em;
   margin:0;
}
fieldset {
   position: relative;
   width: 598px;
   margin: 0px 14px 5px 14px;
   padding: 0;
   border: 1px solid #DEDEDE;
   font-family: Arial, Helvetica, sans-serif;
   color: #666;
   font-size: 11px;
   background-color: #EAEAEA;
}
fieldset.submit {
   width: 600px;
   border-style: none;
   background-image: none;
   padding: 0;
   background-color: #FFFFFF;
   text-align: center;
}
fieldset textarea.text {
   width: 310px;
   color: #000;
   font: 12px Arial, Helvetica, sans-serif;
}
input.submit {
   color: #545351;
   padding: 0 10px;
}
</style>
<script type="text/javascript">
<!--
function MM_validateForm() { //v4.0
  if (document.getElementById){
    var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
    for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=document.getElementById(args[i]);
      if (val) { nm=val.name; if ((val=val.value)!="") {
        if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
          if (p<1 || p==(val.length-1)) errors+='- '+nm+' must contain an e-mail address.\n';
        } else if (test!='R') { num = parseFloat(val);
          if (isNaN(val)) errors+='- '+nm+' must contain a number.\n';
          if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
            min=test.substring(8,p); max=test.substring(p+1);
            if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n';
      } } } else if (test.charAt(0) == 'R') errors += '- '+nm+' is required.\n'; }
    } if (errors) alert('The following error(s) occurred:\n'+errors);
    document.MM_returnValue = (errors == '');
} }
//-->
</script>
</head>

<body>
<div id="container">
<form action="enviar.php" method="post" enctype="multipart/form-data" name="adjuntarPDF">
  <h3>Todos los campos deben ser completados.</h3>
  <fieldset>
    <legend></legend>
    <table align="center" width="540" border="0" cellspacing="0" cellpadding="2">
    <br />
      <tr>
        <td width="119" align="right">Nombre completo:</td>
        <td colspan="5"><input name="nombres" type="Text" id="nombres" size="48" maxlength="48" /></td>
      </tr>
      <tr>
        <td width="119" align="right">E-mail:</td>
        <td colspan="5"><input name="from" type="Text" id="from" size="48" maxlength="48" /></td>
      </tr>
      <tr>
        <td width="119" align="right">Código País:</td>
        <td width="12"><input name="pais" type="text" id="pais" size="2" maxlength="2" /></td>
        <td width="90" align="right">Código de área:</td>
        <td width="12"><input name="area" type="text" id="area" size="2" maxlength="2" /></td>
        <td width="50" align="right">Teléfono:</td>
        <td width="203"><input name="telefono" type="text" id="telefono" size="8" maxlength="8" /></td>
      </tr>
      <tr>
        <td width="119" align="right">Mensaje:</td>
        <td colspan="5"><textarea name="message" rows="5" cols="30" class="text" id="message"></textarea></td>
      </tr>
      <tr>
        <td class="rp" width="119" align="right">Adjuntar PDF</td>
        <td colspan="5"><input name="fileatt" type="file" size="32"accept="application/pdf"/></td>
      </tr>
    </table>
  </fieldset>
  <fieldset class="submit">
    <input type="submit" class="submit" onclick="MM_validateForm('nombres','','R','from','','RisEmail','pais','','RisNum','area','','RisNum','telefono','','RisNum','message','','R');return document.MM_returnValue"  value="Enviar" />
    <input class="submit" type="reset" value="Limpiar" />
  </fieldset>
</form>
</div>
</body>
</html>


Les comento que hice la prueba con caracteres en portugués y también se reciben bien.
Ahora les dejo el php llamado "enviar.php":

Código PHP :

<?php

// Read POST request params into global vars    

$to = '[email protected]';
$subject = 'Asunto de mi formulario de contacto';
$nombres = $_POST['nombres'];    
$from    = $_POST['from'];
$pais = $_POST['pais'];
$area = $_POST['area'];
$telefono = $_POST['telefono'];    
$mensaje = $_POST['message'];

//para dar formato más legible a lo que se recibe por mail
   $message = <<<EOD
Mensaje recibido desde: $subject\n
Nombres: $nombres\n
Email: $from\n
Telefono: $pais $area $telefono\n
Mensaje:\n
$mensaje\n
EOD;

// Obtain file upload vars    
$fileatt      = $_FILES['fileatt']['tmp_name'];    
$fileatt_type = $_FILES['fileatt']['type'];    
$fileatt_name = $_FILES['fileatt']['name'];

$headers = "From: $from";

if (is_uploaded_file($fileatt)) {    
   // Read the file to be attached ('rb' = read binary)    
   $file = fopen($fileatt,'rb');    
   $data = fread($file,filesize($fileatt));    
   fclose($file);
    
   // Generate a boundary string    
   $semi_rand = md5(time());
   $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";    
       
   // Add the headers for a file attachment    
   $headers .= "\nMIME-Version: 1.0\n" .    
            "Content-Type: multipart/mixed;\n" .    
            " boundary=\"{$mime_boundary}\"";
             
   // Add a multipart boundary above the plain message    
   $message = "This is a multi-part message in MIME format.\n\n" .    
            "--{$mime_boundary}\n" .    
            "Content-Type: text/plain; charset=\"utf-8\"\n" .
            "Content-Transfer-Encoding: 7bit\n\n" .    
            $message . "\n\n";
            
    // Base64 encode the file data    
    $data = chunk_split(base64_encode($data));
    
    // Add file attachment to the message    
    $message .= "--{$mime_boundary}\n" .    
             "Content-Type: {$fileatt_type};\n" .    
             " name=\"{$fileatt_name}\"\n" .    
             "Content-Disposition: attachment;\n" .    
             " filename=\"{$fileatt_name}\"\n" .    
             "Content-Transfer-Encoding: base64\n\n" .    
             $data . "\n\n" .    
             "--{$mime_boundary}--\n";
}
 
// Send the message    
$ok = @mail($to, $subject, $message, $headers);

if ($ok) {    
 echo "<p>Tu mail se ha enviado correctamente</p>";    
} 
else {    
 echo "<p>Ha ocurrido un error y tu mail no se envio</p>";    
}  

// o pueden poner la url absoluta de alguna página dando las gracias
//header (("Location: http://www.ejemplotusitio.com/gracias.html"));
   
?>


Ustedes reemplacen las cosas obvias como el email ($to) que recibe los mail, el asunto($subject) y la dirección absoluta de la página de gracias o el mensaje de gracias.
El formulario entero está validado en el botón "enviar".
A pesar de que no sé php, y después de leer doscientos tutoriales lo logré.

Suerte :love:

PD: ¿Alguien me puede decir cómo eliminar mi primer mensaje donde planteo la duda para dejar solamente lo que funciona?
Saludos

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox
Citar            
MensajeEscrito el 27 Jul 2012 04:29 pm
hola, te hago una consulta como seria si en vez de anexar un pdf, quisiera anexar un doc
donde cambiaria el codigo, ya que no me manejo mucho en esto

muchas gracias

Por michaelalfaro

17 de clabLevel



Genero:Masculino  

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.