CodeIgniter 3 proceso subida de ficheros

Una guía aproximada de cómo es el proceso de subida de ficheros en CodeIgniter 3. Tenemos un formulario, ponemos un campo para que el usuario escoja un fichero de su ordenador, y al enviar el formulario, guardamos el fichero en nuestro servidor.

Preparamos el servidor

Lo primero que debemos hacer, es crear una carpeta donde almacenaremos los ficheros que subamos desde el formulario. En el caso del ejemplo será:

/uploads

En esta carpeta creada en la raiz del dominio, almacenaremos todo lo que subamos.

Importante: Asigna permisos que creas oportunos. Si pones permisos 777 ves con cuidado. Además, para asegurar un poco más, pon un fichero index.html vacío que evitará que puedan acceder al servidor navegando.

El formulario

EnCodeIgniter, el formulario debe cumplir las normas de cualquier formulario que se envíe ficheros:

<form id="formulario" action="<?php echo base_url(); ?>/curriculum/send" method="post" enctype="multipart/form-data">
  [...]

  <label>Currículum</label>
  <input type="file" name="userfile" id="userfile" />

  <input type="submit" value="Enviar formulario" />
  [...]
</form>

Fijaos que es mínimo lo que pongo pero para que os hagáis una idea. Importante, dos puntos:

El enctype=»multipart/form-data» que indica que el formulario contiene un adjunto.

El campo <input type=»file» name=»userfile» id=»userfile» /> que será el campo donde el usuario podrá seleccionar su fichero.

El controlador

Lo primero que cargaremos en nuestro controlador, son los helpers de form y url. Y la librería form_validation para poder validar los campos recividos.

Cargamos helpers y librerías

if (!defined('BASEPATH')) exit('No direct script access allowd');

class Curriculum extends CI_Controller {

    function __construct() {
        parent::__construct();
        // Form
        $this->load->helper('form', 'url');
        // Librerias
        $this->load->library('form_validation');
    }

}

Ahora veamos un estracto del controlador, donde se trata la subida del fichero.

if (!defined('BASEPATH')) exit('No direct script access allowd');

class Curriculum extends CI_Controller {

  function __construct() {
    parent::__construct();
    // Form
    $this->load->helper('form', 'url');
    // Librerias
    $this->load->library('form_validation');
  }

  [...]

  function send() {
    [...]

    $config['upload_path']          = './uploads/';
    $config['allowed_types']        = 'pdf';
    $config['max_size']             = 2048;

    $this->load->library('upload', $config);

    if ( ! $this->upload->do_upload('userfile'))
    {
      $mensaje = "No se ha subido correctamente el fichero";
    }
    else
    {
      $data= $this->upload->data();
      $nombrefitxer = $data["file_name"];
      $mensaje = "Fichero subido correctamente: ". $nombrefichero;
    }

    [...]

    return $mensaje;
  }

  [...]

}

Configuración

Primero debemos configurar la subida. Lo hacemos rellenando los valores del Array $config. Le decimos el path donde queremos almacenar nuetro fichero, los tipos soportados y peso máximo.

Importante: La variable $config[‘upload_path’] es la que normalmente da más problemas. Aparte de tener la carpeta destino creada y con los permisos correspondientes, en esta variable hay que poner de forma correcta. En muchos de los casos, si la carpeta está en la raiz de la web, el formato es el que os dejo: ./carpetadestino.

Por otro lado, el peso $config[‘max_size’], es en Kb. En el ejemplo, 2048 son 2 MB.

Cargar librería upload con configuración

Ahora que tenemos las variables con la configuración, cargamos librería:

$this->load->library(‘upload’, $config);

Tratamos fichero subido

Con la fucnión $this->upload->do_upload(‘userfile’) subimos el fichero y nos devuelve si es correcto o no.

Si se ha subido correctamente, podemos utilizar la función $data= $this->upload->data(); para recoger todos los datos del fichero subido.

Manejar errores

En el caso que algo vaya mal, para capturar el error, lo haremos con: $this->upload->display_errors(», »);

Veamos cómo quedaría en el ejemplo:

if (!defined('BASEPATH')) exit('No direct script access allowd');

class Curriculum extends CI_Controller {

  function __construct() {
    parent::__construct();
    // Form
    $this->load->helper('form', 'url');
    // Librerias
    $this->load->library('form_validation');
  }

  [...]

  function send() {
    [...]

    $config['upload_path']          = './uploads/';
    $config['allowed_types']        = 'pdf';
    $config['max_size']             = 2048;

    $this->load->library('upload', $config);

    if ( ! $this->upload->do_upload('userfile'))
    {
      $mensaje = "No se ha subido correctamente el fichero <br />". $this->upload->display_errors('<p>', '</p>');;
    }
    else
    {
      $data= $this->upload->data();
      $nombrefitxer = $data["file_name"];
      $mensaje = "Fichero subido correctamente: ". $nombrefichero;
    }

    [...]

    return $mensaje;
  }

  [...]

}

Añadimos al mensaje, los errores que se hayan producido al subir el fichero.

Espero que esta guía os facilite y que hayáis aprendido a cómo es el proceso de subida de ficheros con CodeIgniter 3. También os dejo el enlace hacía la librería Upload de CodeIgniter que también os ayudará.


Más información