Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Formulario: subir archivo y enviarlo por mail

Estas en el tema de Formulario: subir archivo y enviarlo por mail en el foro de PHP en Foros del Web. Hola! Buen día a todo mundo. La idea es subir un archivo mediante un input file y enviarlo por correo sólo si es DOC o ...
  #1 (permalink)  
Antiguo 13/08/2014, 07:12
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 1 mes
Puntos: 22
Pregunta Formulario: subir archivo y enviarlo por mail

Hola!

Buen día a todo mundo.

La idea es subir un archivo mediante un input file y enviarlo por correo sólo si es DOC o PDF y pesa menos de, digamos, 45 kilobytes.

Utilizo una variación del script que se encuentra al final de este post.
Código PHP:
if ( $_FILES['archivo'] )
{
    
$tipo   $_FILES['archivo']['type'];
    
$tamano $_FILES['archivo']['size'];
    

    if (
$tamano 45000)
    {
        if ( 
strpos($tipo"doc") || strpos($tipo"docx") || strpos($tipo"pdf") )
        {
          
$archivoCorrecto  true;
        }
        else
        {
          
$archivoCorrecto  false;
        }
    }

Estas líneas funcionan bien en el caso de archivos PDF, y el archivo se envía correctamente por correo. Pero no en caso de documentos DOC o DOCX. ¿Por qué? ¿Alguna idea?

Saludos!

Última edición por berkeleyPunk; 13/08/2014 a las 07:18
  #2 (permalink)  
Antiguo 13/08/2014, 07:31
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: Formulario: subir archivo y enviarlo por mail

Cita:
Estas líneas funcionan bien en el caso de archivos PDF, y el archivo se envía correctamente por correo. Pero no en caso de documentos DOC o DOCX. ¿Por qué? ¿Alguna idea?
Dichas lineas no hacen nada más que comprobar el tipo de archivo, no de envíarlo ni nada, ese procedimiento no lo has mostrado.

Además, ¿por qué no explicas a detalle lo que sucede?

Decir "pero esto no sirve para tal cosa" no nos dice mucho, sobre todo si no hay un contexto.

¿Estás depurando tu código para ver que valores estás comparando?

No podemos ejecutar mentalmente tu código y decirte que corregir.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 13/08/2014, 07:45
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 1 mes
Puntos: 22
Pregunta Respuesta: Formulario: subir archivo y enviarlo por mail

Cita:
Iniciado por pateketrueke Ver Mensaje
...Además, ¿por qué no explicas a detalle lo que sucede?...
Buen día, maestro.

Muy bien. Tengo un formulario que incluye un <input type ="file" name="archivo" />. El submit nos lleva a un process.php, el cual contiene en 1ra instancia las líneas que puse más arriba, que sólo las empleo para saber si existe el archivo con las características pertinentes.

Ahora, si resulta que la variable $archivoCorrecto es igual a true entonces se envía el archivo por correo mediante la clase PHPMailer:

Código PHP:
    if ($forma == "formaReclutamiento" && $nombre && $email)
    {
        
$mail = new PHPMailer();
        
$mail->CharSet "UTF-8";
        
$mail->setFrom('[email protected]''Durán');  
        
$mail->addReplyTo('[email protected]''Durán');  
        
$mail->addAddress('[email protected]''Durán');
        
// $mail->addAddress('[email protected]', 'Reclutamiento Balper');
        // $mail->addCC($email, $nombre);
        // $mail->addBCC('[email protected]', 'paradigmacero');
        // $mail->addBCC('[email protected]', 'paradigmacero');
        // $mail->addBCC('[email protected]', 'paradigmacero');

        
$mail->Subject 'Nuevo mensaje de reclutamiento del sitio web BALPER.';
        
$mail->isHTML(true);
$str =
<<<EOF
<p>Aquí va el HTML del cuerpo del mensaje</p>
EOF;
    
$mail->Body  $str;

        if ( 
$archivoCorrecto == true )
        {
            
$mail->AddAttachment($archivo['tmp_name'], $archivo['name']);
        }

        if ( !
$mail->send() )
        {
            
header("Location: error.html");
        }
        else
        {
            
header("Location: gracias-reclutamiento.html");
        }
    }

Saludos!
  #4 (permalink)  
Antiguo 13/08/2014, 07:47
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: Formulario: subir archivo y enviarlo por mail

Y cuando hablas de los archivos DOC/DOCX:

¿Qué valor tiene $tipo para que $archivoCorrecto sea false?

¿Además el peso de los archivos está dentro del rango de tu comparación?

¿Hay que seguir adivinando?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 13/08/2014, 07:52
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 1 mes
Puntos: 22
Pregunta Respuesta: Formulario: subir archivo y enviarlo por mail

Cita:
Iniciado por pateketrueke Ver Mensaje
Y cuando hablas de los archivos DOC/DOCX: ¿qué valor tiene $tipo para que $archivoCorrecto sea false?
Pues hasta donde entiendo, el if que contiene el strpos() se encarga de eso, ¿no? : Es decir, si no se encuentra la subcadena DOC, DOCX o PDF, entonces $archivoCorrecto es igual a false.


Y sí, los archivos que intento subir, pesan menos de 45 kilobytes.

Otra cosa, maestro, en mis pruebas, veo que PHP lee bien el peso del archivo cargado, sí le hace caso y no sube el archivo si pesa más de 45 kilobytes. Hasta donde veo, el problema está en la detección del tipo de archivo.

Última edición por berkeleyPunk; 13/08/2014 a las 07:58
  #6 (permalink)  
Antiguo 13/08/2014, 07:58
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: Formulario: subir archivo y enviarlo por mail

¿Sabes lo que significa depurar código?

Sí, sí, el if() con strpos() se encarga de buscar "doc", "docx" y "pdf" respectivamente.

Y claro, entonces $archivoCorrecto nunca es true para enviar el archivo ¿verdad?

Eso es obvio, eso ya lo sabemos.

Lo que no sabemos, ni podemos adivinar, y curiosamente no te animas a depurar es: ¿qué valor tiene $tipo para que el if() y strpos() no validen correctamente y el resultado de $archivoCorrecto sea false?

No podemos ejecutar tu código mentalmente y corregir lo que hiciste mal, ¿qué tan dificil es depurar tu código para indagar si los datos están bien?

Código PHP:
Ver original
  1. $tipo   = $_FILES['archivo']['type'];
  2. $tamano = $_FILES['archivo']['size'];
  3.  
  4. echo "TIPO= $tipo<br>";
  5. echo "TAMAÑO= $tamano<br>";

¿Qué valores muestra cuando tu script no adjunta nada?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 13/08/2014, 10:04
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 1 mes
Puntos: 22
Respuesta: Formulario: subir archivo y enviarlo por mail

Cita:
Iniciado por pateketrueke Ver Mensaje
...Lo que no sabemos, ni podemos adivinar, y curiosamente no te animas a depurar es: ¿qué valor tiene $tipo para que el if() y strpos() no validen correctamente y el resultado de $archivoCorrecto sea false?...
Ok, ok, es que no me tienes paciencia .

Ya, hablando en serio. Hice la depuración y en pantalla se devuelve el tamaño en bytes y el tipo MIME.

Ahora veo que al hablar del tipo de archivo acerca de un $_FILES['archivo'] no se habla de la extensión que tiene el archivo en tu explorer (o finder), sino del tipo MIME. Así que el tipo no es DOC sino msword, y no es DOCX sino vnd.openxmlformats-officedocument.wordprocessingml.document. En el caso del PDF, sí es PDF.

¿No era más fácil que me dijeras eso, maestro pateketrueke?

Bueno, la verdad sí era más fácil decirme eso, pero ya veo tu método pedagógico, se entiende bien.

En resumen, para que funcionara el script sólo hacía falta modificar una línea:
Código PHP:
if ( strpos($tipo"vnd.openxmlformats-officedocument.wordprocessingml.document") || strpos($tipo"msword") || strpos($tipo"pdf") ) 
Saludos!

Etiquetas: formulario, mail
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 13:35.