Foros del Web » Programando para Internet » PHP »

Validar formulario php de archivos

Estas en el tema de Validar formulario php de archivos en el foro de PHP en Foros del Web. Amigos necesito ayuda, no soy experto en php. Tengo casi listo un formulario para subir archivos y ser enviados via mail, solo me falta validar ...
  #1 (permalink)  
Antiguo 17/09/2018, 18:50
Avatar de bathory84  
Fecha de Ingreso: junio-2010
Ubicación: Venezuela
Mensajes: 246
Antigüedad: 8 años, 4 meses
Puntos: 1
Validar formulario php de archivos

Amigos necesito ayuda, no soy experto en php. Tengo casi listo un formulario para subir archivos y ser enviados via mail, solo me falta validar el tamaño maximo (5 mb) y colocar que solo acepte archivos tipo .pdf / .doc. / .docx / .jpg / .png este es mi codigo que funciona bien, me gustaria que me ayudaran a colocarle estas validaciones a este codigo:

Código PHP:
<?php

  $para    
"[email protected]";//$_POST['para'];
  
$asunto  "Envio de CV o Titulo";//$_POST['asunto'];
  

  // procedemos a subir el archivo adjunto al servidor
  
$origen $_FILES['curriculo']['tmp_name'];
  
$destino "curriculos/".$_FILES['curriculo']['name'];

  if([email protected]
move_uploaded_file($origen$destino)){
    die(
"Error al tratar de enviar el Archivo");
  }
  
    
// abrimos el archivo y lo leemos
  
$fp fopen($destino'rb');
  
$data fread($fp$_FILES['curriculo']['size']);
  
fclose($fp);
  
//$data = file_get_contents($destino);

  //aplicamos el formato RFC 2045
  
$data chunk_split(base64_encode($data));

  
//inicializamos el borde multiparte
  
$borde_mime "BORDE_MULTIPARTE_123";
  
  
//definición del \r\n
  
$ent chr(13).chr(10);

  
//se indica el tipo multiparte y se le indica el nombre del borde
  
$encabezados "Content-Type: multipart/mixed; boundary=".chr(34).$borde_mime.chr(34);
  
  
//se crea el cuerpo del mensaje
  
$mensaje  "--$borde_mime".$ent 
  
$mensaje .= "Content-Type: text/html; ".
              
"charset=".chr(34)."iso-8859-1".chr(34).";".$ent.$ent;
  
$mensaje .= $_POST['mensaje'].$ent.$ent;
             
  
//se inserta un nuevo borde, la información del archivo y la data
  
$mensaje .= "--$borde_mime".$ent;
  
$mensaje .= "Content-Type: ".$_FILES['curriculo']['type'].";".
             
"name=".chr(34).$_FILES['curriculo']['name'].chr(34).";".$ent;
  
$mensaje .= "Content-Transfer-Encoding: base64 ".$ent;
  
$mensaje .= "Content-Disposition: attachment; filename=".chr(34).$_FILES['curriculo']['name'].chr(34).";".$ent.$ent;
  
$mensaje .= "$data".$ent;


  
//se incluye el fin de los contenedores
  
$mensaje .= "--$borde_mime--".$ent;

    
$enviado mail($para,$asunto,$mensaje,$encabezados);



if(
$enviado == true){
               
            print 
'<script language="JavaScript">';
            print 
'alert("El Archivo ha sido enviado satisfactoriamente.");';
              print 
'location.href=("trabajos.html");';
            print 
'</script>';
            } 
            else 
            {
            print 
'<script language="JavaScript">';
            print 
'alert("El Archivo no se ha podido enviar. \nIntente de Nuevo.");';
              print 
'location.href=("trabajos.html");';
            print 
'</script>';
            
}
?>
  #2 (permalink)  
Antiguo 18/09/2018, 06:19
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.957
Antigüedad: 5 años, 3 meses
Puntos: 370
Respuesta: Validar formulario php de archivos

Para validar el tamaño maximo te recomiendo que hagas el ajuste en el php.ini http://php.net/manual/es/ini.core.ph...d-max-filesize
Si requieres validar el tamaño del archivo lo puedes hacer mediante la función filesize y una condición
Código PHP:
Ver original
  1. if (filesize($_FILES['file']['tmp_name']) < 2000000) {
  2.     //
  3. }
Para validar las extensiones solo crea un arreglo y usa la clase fileinfo de php para obtener la extensión http://php.net/manual/es/splfileinfo.getextension.php

Tambien seria bueno que verificaras el mime-type de los archivo, aquí tienes la lista completa de tipos https://www.iana.org/assignments/med...ia-types.xhtml
y puedes hacer la verificación mediante la función finfo: http://php.net/manual/es/function.finfo-file.php

Creo que con eso tiene lo necesario para resolver el problema
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 18/09/2018, 11:02
Avatar de alvaro_trewhela  
Fecha de Ingreso: octubre-2012
Ubicación: localhost
Mensajes: 903
Antigüedad: 6 años
Puntos: 104
Respuesta: Validar formulario php de archivos

y para los tipos:

$finfo = new finfo(FILEINFO_MIME);
$type = $finfo->file($_FILES["file_input_name"]["tmp_name"]);

$types = ["image/png", "image/jpeg", ...];

if(in_array($type,$types)){
//ok
}
  #4 (permalink)  
Antiguo 18/09/2018, 21:27
Avatar de bathory84  
Fecha de Ingreso: junio-2010
Ubicación: Venezuela
Mensajes: 246
Antigüedad: 8 años, 4 meses
Puntos: 1
Respuesta: Validar formulario php de archivos

Voy a probar todo esto y les informo muchachos, gracias...
  #5 (permalink)  
Antiguo 21/09/2018, 11:33
Avatar de bathory84  
Fecha de Ingreso: junio-2010
Ubicación: Venezuela
Mensajes: 246
Antigüedad: 8 años, 4 meses
Puntos: 1
Respuesta: Validar formulario php de archivos

Pude colocar este codigo y funciona el mensaje plasmado de acuerdo a lo que se pide, si pasa los 5 mb sale el mensaje negativo y si pesa menos es positivo.

Pero el problema es aunque el archivo sea mayor a 5 mb y salga el mensaje de que no se puede enviar, igual se envia y lo sube al servidor.

Código PHP:
if (filesize($_FILES['curriculo']['tmp_name']) < 5000000) {
               
            print 
'<script language="JavaScript">';
            print 
'alert("El Archivo ha sido enviado satisfactoriamente.");';
              print 
'location.href=("trabajos.html");';
            print 
'</script>';
            } 
            else 
            {    
            print 
'<script language="JavaScript">';
            print 
'alert("El Archivo no se ha podido enviar. \nIntente de Nuevo.");';
              print 
'location.href=("trabajos.html");';
            print 
'</script>'
LA IDEA ES QUE SI PASA LOS 5 MB NO SE ENVIE NI SE SUBA AL SERVIDOR.
  #6 (permalink)  
Antiguo 21/09/2018, 18:42
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.957
Antigüedad: 5 años, 3 meses
Puntos: 370
Respuesta: Validar formulario php de archivos

Normalmente si algo no se cumple lo adecuado es que regreses al la pagina del formulario e informes de los errores, tu no lo estas haciendo. Solo imprimes un aviso y el script se sigue ejecutando hasta terminar y eso incluye que se suba el archivo.

Para evitar esto necesitas obligar a que el script termine en el momento que no se cumple la condición, y como te comente lo mas usual es redirigir la petición de regreso al formulario eso lo haces mediante el uso de la función header

De forma general debes de hacer algo como esto.
Código PHP:
Ver original
  1. function redirect($url) {
  2.  
  3.         'Location: %s',
  4.         $url
  5.     ));
  6.     exit();
  7. };
  8.  
  9. if (filesize($_FILES['curriculo']['tmp_name']) > 5000000) {
  10.     redirect('form.php');
  11. }
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 29/09/2018, 11:44
Avatar de bathory84  
Fecha de Ingreso: junio-2010
Ubicación: Venezuela
Mensajes: 246
Antigüedad: 8 años, 4 meses
Puntos: 1
Respuesta: Validar formulario php de archivos

Esto me sirvió muy bien para redirigir la pagina pero sigue subiendo el archivo al servidor y lo sigue enviando al correo aunque salga el mensaje de archivo no enviado, pero igual lo envia.

Se necesita que no suba el archivo si pesa mas de 5000000 KB. LO QUE TENGO EN LA PARTE FINAL ES ESTO:

Código PHP:
Ver original
  1. if (filesize($_FILES['curriculo']['tmp_name']) < 5000000) {
  2.            
  3.             print '<script language="JavaScript">';
  4.             print 'alert("El Archivo ha sido enviado satisfactoriamente.");';
  5.             print 'location.href=("trabajos.html");';
  6.             print '</script>';
  7.             }
  8.             else
  9.             {  
  10.             function redirect($url) {
  11.      
  12.         header(sprintf(
  13.             'Location: %s',
  14.             $url
  15.         ));
  16.         exit();
  17.     };
  18.      
  19.     if (filesize($_FILES['curriculo']['tmp_name']) > 5000000) {
  20.             print '<script language="JavaScript">';
  21.             print 'alert("El Archivo Supera el Tamaño de 5 MB. \nIntente con Otro....");';
  22.             print 'location.href=("trabajos.html");';
  23.             print '</script>';
  24.     }
  25.            
  26. }


Cita:
Iniciado por hhs Ver Mensaje
normalmente si algo no se cumple lo adecuado es que regreses al la pagina del formulario e informes de los errores, tu no lo estas haciendo. Solo imprimes un aviso y el script se sigue ejecutando hasta terminar y eso incluye que se suba el archivo.

Para evitar esto necesitas obligar a que el script termine en el momento que no se cumple la condición, y como te comente lo mas usual es redirigir la petición de regreso al formulario eso lo haces mediante el uso de la función header

de forma general debes de hacer algo como esto.
Código php:
Ver original
  1. function redirect($url) {
  2.  
  3.         'location: %s',
  4.         $url
  5.     ));
  6.     exit();
  7. };
  8.  
  9. if (filesize($_files['curriculo']['tmp_name']) > 5000000) {
  10.     redirect('form.php');
  11. }

Última edición por bathory84; 29/09/2018 a las 15:19
  #8 (permalink)  
Antiguo 30/09/2018, 10:19
 
Fecha de Ingreso: abril-2006
Mensajes: 117
Antigüedad: 12 años, 5 meses
Puntos: 9
Respuesta: Validar formulario php de archivos

La razon es por que PHP no sabe cuanto pesa el archivo, y por lo cual solo lo sabra una vez se SUBA al servidor el archivo, por eso te recomendaron, hacerlo desde el PHP.INI un archivo de configuracion, para controlarlo tienes otras opciones si lo usas con APACHE y esta con MODULE_PHP , puedes usar el archivo .HTACCESS para darle los parametros necesarios. o como la mayoria lo hace, mediante JAVASCRIPT, para restringirle en el lado del cliente, y decirle que el archivo maximo es de 5MB, ahora estamos en tiempos modernos, y la mayoria ya tiene navegadores avanzados y soportan esa caracteristica de javascript.

Pero eso si, no descuides el lado del servidor, de PHP, esta bien limitar los datos, tanto en el lado del cliente como en el servidor.



La zona horaria es GMT -6. Ahora son las 19:16.