Importar archivo a servidor y guardar la informacion en una base de datos mysql con php y jQuery


En el post del día de hoy vamos a ver como podemos subir un archivo al servidor para después guardar la información dentro de una base de datos, y lo vamos a hacer utilizando PHP, jQuery y MySQL.

HTML

El formulario HTML que se va a utilizar para subir el archivo al servidor tiene la siguiente estructura

<form id="frmArchivo" method="post">
   <label>Archivo:</label>
   <input id="archivo" type="file" name="archivo" />
   <input type="hidden" name="MAX_FILE_SIZE" value="20000" />
   <input class="boton" type="submit" name="enviar" value="Importar" />
</form>

La información del formulario se va a enviar con el método post. Dentro del formulario tenemos los controles en este caso un input de tipo file para el archivo que se va a subir, un input hidden que indica el tamaño máximo del archivo que se va a subir y el botón de submit para mandar el formulario al servidor.

jQuery

Bien, lo que sigue es crear el código jQuery para mandar con ajax el archivo al servidor. Y lo primero que hacemos es colocar la declaración $document.ready dentro de la etiqueta <head>

$(document).ready(function(){

Posteriormente asignamos el evento submit al formulario el cual obtenemos a través de su atributo id

   $("#frmArchivo").submit(function(){

Ahora creamos una variable llamada datos para almacenar la información del formulario, para esto utilizamos el objeto FormData() que permite crear un conjunto de valores key/valor utilizando el método .append, otra característica es que utiliza el encoding multipart/form-data por lo tanto no es necesario que lo coloquemos enctype=”multipar/form-data” en el HTML del formulario.

      var datos = new FormData();
      datos.append('archivo',$('#archivo')[0].files[0]);

Ahora hacemos la petición ajax con los siguientes valores: el tipo va a ser “POST”, la respuesta del servidor la vamos a obtener como un JSON, la pagina que va a procesar la petición es importar.php, contentType lo ponemos en false para que los datos se envíen con multipart/form-data de lo contrario lo enviaría como “application/x-www-form-urlencoded; charset=UTF-8” que es el valor por default, data con la variable datos que recogió el archivo a enviar y processData a falso para evitar que la información se envíe como una cadena ya que vamos a enviar un archivo. La respuesta del servidor la vamos a recoger en la variable respuesta misma que mostramos con un alert


  $.ajax({
    type:"post",
    dataType:"json",
    url:"importar.php",
    contentType:false,
    data:datos,
    processData:false,
  }).done(function(respuesta){
    alert(respuesta.mensaje);
});

Para que no ejecute el submit del formulario retornamos false y termina el código de jQuery


return false;
});
});

CODIGO PHP

En el archivo importar.php se coloca el siguiente código

Accedemos al archivo utilizando la variable global $_FILES y el nombre con el que se envió, para este ejemplo el nombre es archivo

<?php
$tipo = $_FILES['archivo']['type']; $tamanio = $_FILES['archivo']['size']; $archivotmp = $_FILES['archivo']['tmp_name'];

Creamos la variable que va a contener la respuesta

$respuesta = new stdClass();
$respuesta->mensaje = "";

Evaluamos el tipo de archivo que se subió, para este ejemplo el tipo de archivo permitido es .csv

if( $tipo == 'application/vnd.ms-excel'){

Una vez que se verificó el tipo de archivo lo que hacemos es mover el archivo temporal hacia una carpeta y le asignamos un nombre, nuestro archivo se va a guardar dentro de la carpeta archivos y lo nombraremos alumnos.csv, la ruta y el nombre del archivo puede ser el que ustedes elijan.

   $archivo = "archivos/alumno.csv";

   if(move_uploaded_file($archivotmp, $archivo) ){
      $respuesta->estado = true;
   } else {
      $respuesta->estado = false;
      $respuesta->mensaje = "El archivo no se pudo subir al servidor, inténtalo mas tarde";
   }

Si el archivo se movió con éxito pasamos a leer el contenido para guardar la información que contiene en la base de datos


 if($respuesta->estado){

    /* Se crea la conexión a la base de datos*/
    $conexion = new mysqli('localhost','usuario','password','basedatos',3306);

Almacenamos la información del archivo en la variable $lineas y con un foreach recorremos cada linea, Para obtener cada campo utilizamos la función explode en la cual se busca una coma(,) para separarlos, dicha información se guarda en la variable datos. Posteriormente se crea la consulta de inserción y se ejecuta, si no ocurrió algún error se pasa a la siguiente linea de lo contrario el estado de la respuesta cambia a falso y se agrega al mensaje el registro que no se inserto.

    $lineas = file('archivos/alumno.csv');
    foreach ($lineas as $linea_num => $linea)
    {
       $datos = explode(",",$linea);
       $matricula = trim($datos[0]);
       $paterno = trim($datos[1]);
       $materno = trim($datos[2]);
       $nombre = trim($datos[3]);

       $consulta = "INSERT INTO tblalumno(matricula,paterno, materno, nombre) VALUES('$matricula', '$paterno', '$materno', '$nombre');";
       if(!$conexion->query($consulta)){
          $respuesta->estado = false;
          $respuesta->errormsg .= "El alumno $paterno $materno $nombre no se guardo, verifica la información \n";
       }
    }

Después verificamos si no hubo algún error al leer y guardar la información, si es así el mensaje indicara que todo ocurrió correctamente, también colocamos el else de la primer condición sobre el tipo de archivo en la cual ponemos el mensaje de error correspondiente. Al final se imprime la variable respuesta como json.

    }
    if($respuesta->estado == true)
       $respuesta->mensaje = "Todos los registros se guardaron correctamente\n";
}
else {
   $respuesta->mensaje = "La información no se guardo debido a que solo se admiten archivos .csv\n";
}
 echo json_encode($respuesta);
?>

Eso es todo por hoy, aquí les dejo el link de descarga, si el contenido les es útil denle clic a me gusta a nuestra pagina de Facebook, recomienden el blog y sigan practicando.

download

30 comentarios en “Importar archivo a servidor y guardar la informacion en una base de datos mysql con php y jQuery”

  1. ruth dice:

    hola!!! estoy haciendo algo similar a esto, pero tengo un problema, aparece este error “Failed to load resource: the server responded with a status of 500 (Internal Server Error)”.
    ojala puedan ayudarme. Gracias, espero su respuesta.

    1. denker dice:

      El error esta en el código del servidor, tal vez alguna variable o la consulta, tienes que depurar tu código para ello puedes revisar el log del servidor o hacerlo con netbeans, saludos

    2. sun2012 dice:

      Tal vez necesita permisos de escritura la carpeta donde lo subes o el archivo es demasiado pesado.

  2. Daniel Lozano dice:

    Buenos días estoy intentando descargar los archivos de ejemplo pero el link esta roto, me prodriais ayudar

    1. denker dice:

      Ya esta disponible el link de descarga, saludos

  3. Hugo dice:

    Hola gracias por el ejmplo , estoy tratando de hacerlo con base datos OORACLE (OCI)
    no tendras este ejmplo con oracle , en la web no casi nada de imrpotar archivos Excel con php y OCI
    Saludos..

    1. enrique dice:

      saludos buen ejemplo, quiero hacerlo con oracle y no funciona tendria algun ejemplo por ali pofa

  4. Wilmer dice:

    Buenos días, noches: Excelente los aporte que estas brindando, muy recomendado, sigue adelante!!!…

  5. igor dice:

    buenas tardes,

    estoy intentando con archivos .txt como hago para que acepte este formato.

    excelente tutorial

    Gracias

    1. denker dice:

      Solo tienes que comparar el tipo utilizando ‘text/plain’

      Saludos

  6. igor dice:

    graciassss,

    pero tengo una duda mas si es un archivo con mas de 2000 registro solo ingresa 218 ¿por que sucede?

    1. denker dice:

      Puede ser que no tiene memoria suficiente para leer todo el archivo. Puedes leerlo linea a linea con la funcion fgets aunque va a ser muy tardado

  7. Carlos dice:

    Amigo necesito saber si puedo poner mi archivo el que se sube al server, y no ese ‘archivos/alumno.csv’ como seria te agradezco….

  8. igor dice:

    listo solucionado solo debo poner al inicio del script set_time_limit(0); de lo contrario después de 30 segundos arroja el error, otra duda como hago para eliminar la primera linea debido a que pertenece al encabezado.

    gracias excelente ayuda

  9. luis dice:

    hace falta un demo

  10. JUAN dice:

    Como empezar el la segunda linea del csv

    1. denker dice:

      Puedes poner una bandera para omitir la primer linea

  11. Lionel dice:

    Te quiero agradecer la ayuda , es excelente tu aporte.
    Muchas Gracias

  12. Juan Carlos dice:

    Esta muy bien tu ejemplo, pero tengo una duda, “application/vnd.ms-excel” = a una hoja de excel, en mi caso, quiero guardar un archivo .txt, cual es ese tipo de aplicacion?

  13. roxelys dice:

    Estoy intentando hacer algo parecido pero la extensión es xls creen que funcione igual?

  14. Marcelo Lema dice:

    Quisier que me ayuden, no encuentro explicacion de porque utilica la linea con los siguientes parametros:
    datos.append(‘archivo’,$(‘#archivo’)[0].files[0]);
    quer siginifica [0].files[0]

    me podrian decirme para que uitilisa estos parametros,

  15. gio dice:

    Muy lindo…. lo voy a descRgar.. . Pero tengo una duda…. si hay algún registro repetido…. como le hago para que no me lo duplique y me actualize la info…. para conservar el ID del original? Saludos…. tratare de trabajar en eso

  16. Xavier dice:

    Hola tengo una duda, yo use todo el codigo y logre cargar un archivo de excel perfectamente, el problema viene cuando trato de cargar un archivo que pesa mas de 2 MB y tiene mas de 8000 registros.

    En el momento en el que intento guardar los 8000 registros, en la base de datos solo se me guardan 1600 como maximo, que debo hacer para poder guardar todos los registros de mi excel en la base de datos?? Acaso MySQL tiene alguna limitante en el tamaño de los archivos excel a subir?? Gracias y saludos!

    1. sun2012 dice:

      Aumenta el tiempo de ejecución del php max_execution_time

  17. Raul Guapacho dice:

    cree un archivo .csv y siempre me dice que solo se admiten archivos .csv vuelve a intentarlo

  18. cipoleto dice:

    Te hago una consulta, se puede realizar con archivos .DBF ?
    Excelente aporte,saludos.

  19. Dominous dice:

    Hermano Excelente 100% te la comiste, me salvaste la vida, pero una pregunta como hago para que lea archivos .SQL
    Apreciaría sus respuestas gracias de ante mano

  20. Buenas tardes, aplique el código y todo estaba perfecto hasta que en el archivo aparecieron cadenas con tildes, y al hacer un select en la BD con dicho valor obtenedido del archivo .csv, me genera problemas, depronto sabes que puedo hacer en este caso. Gracias

  21. se pude iniciar desde la segunda linea ??

  22. Alexander paz dice:

    Si cargo un archivo .Zip al servidor el cual contiene varios archivos de texto, cómo hago para descomprimirlo y luego cargar la información de cada uno de los archivos a sus respectivas tablas en MySQL.

Deja un comentario