Carga o upload de archivos con CodeIgniter 3

- Andrés Cruz

Carga o upload de archivos con CodeIgniter 3

 

CodeIgniter ofrece una cantidad importante de librerías y funcionalidades para realizar diversas tareas para lo poco que pesa este famoso framework PHP.

En este artículo veremos cómo hacer un upload o carga de archivos empleando CodeIgniter en conjunto con la librería nativa que ofrece para tal fin; con esto podemos cargar cualquier tipo de imágenes, archivos de textos comprimidos etc; en general, cualquier tipo de archivos que permitamos al momento de realizar la configuración.

Definiendo el formulario HTML básico para la carga de archivos

Lo primero que debemos hacer es definir el formulario en HTML básico como el siguiente:

<form action="cargar_archivo" method="post" enctype="multipart/form-data"> <input type="file" name="mi_archivo"> </form> <input type="submit" value="Submit">

El mismo lo guardaremos en la ubicación por defecto de las vistas:

application/views/subir_fichero.php

CodeIgniter provee metodos para construir formularios (Form Helper) y para validarlos (Form Validation), pero los mismos no son tema principal de este artículo y por ende solo procedemos a mencionarlo; ya queda de su preferencia la forma en la que decida trabajarla.

Puntos importante del formulario para la subida de archivos o ficheros:

  • enctype="multipart/form-data": Este atributo especifica que la data del formulario va ha ser codificada cuando sea enviada al servidor; la presencia de este atributo es necesaria cuando se desea cargar (upload) archivos al servidor.
  • El nombre del input de tipo file; el cual será referenciado en el controller en CodeIgniter; para este ejemplo será llamado mi_archivo.
  • El atributo action; especifica la página a la cual será enviada la data; es decir nuestro archivo.

Definiendo el controlador en CodeIgniter

Para ello nos vamos a la carpeta controller de CodeIgniter y creamos un controller o controlador (archivo PHP); para este ejemplo lo llamaremos archivo.php; en resumen, el controlador que emplearemos para subir o cargar el archivo lo ubicamos en:

application/controllers/archivo.php

Y tendrá el siguiente contenido:

<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class Archivo extends CI_Controller {

  public function index(){ 
        $this->load->view('subir_fichero');
   }

    function cargar_archivo() {

        $mi_archivo = 'mi_archivo';
        $config['upload_path'] = "uploads/";
        $config['file_name'] = "nombre_archivo";
        $config['allowed_types'] = "*";
        $config['max_size'] = "50000";
        $config['max_width'] = "2000";
        $config['max_height'] = "2000";

        $this->load->library('upload', $config);
        
        if (!$this->upload->do_upload($mi_archivo)) {
            //*** ocurrio un error
            $data['uploadError'] = $this->upload->display_errors();
            echo $this->upload->display_errors();
            return;
        }

        $data['uploadSuccess'] = $this->upload->data();
    }
}

Preferencias del archivo

El array $config indica preferencias para el archivo a cargar; las cuales pueden ser:

PreferenciaValor por defectoOpcionesDescripción
upload_pathNoneNoneLa carpeta destino donde será cargado el archivo; asegurese que la carpeta tenga permisos de escritura y la ruta empleada en la misma debe ser absoluta o relativa y no una URL.
allowed_typesNoneNoneEl mime del archivo; si vas a especificar más de una debes de separarlos por pipes ('|').
file_nameNone El nombre que tendrá el archivo al ser depositado en la carpeta.
overwriteFALSETRUE/FALSE (boolean)TRUE para sobrescribir archivos con el mismo nombre en la carpeta destino y FALSE en caso contrario.
max_size0NoneEl máximo tamaño (en kilobytes) que puede tener el archivo. Establecer en cero para que no haya límites.
max_width0NoneEn el caso de imágenes, este valor indica la máxima anchura en píxeles que pueden tener las imágenes; cero para no establecer un límite.
max_height0NoneEn el caso de imágenes, este valor indica la máxima altura en píxeles que pueden tener las imágenes; cero para no establecer un límite.
max_filename0NoneLa máxima longitud que puede tener el nombre del archivo; cero para no establecer un límite.
encrypt_nameFALSETRUE/FALSE (boolean)TRUE para que el archivo sea encriptado.
remove_spacesTRUETRUE/FALSE (boolean)TRUE para remover espacios en el nombre del archivo.

Inicializamos la clase Upload

La función $this->load->library permite inicializar la clase Upload en nuestro controlador pasando como uno de sus parámetros la configuración.

La función do_upload(?)

Luego de configuradas las preferencias del archivo, el siguiente paso es cargar el mismo para ello empleamos la función $this->upload->do_upload($mi_archivo) cuyo parámetro es el nombre del archivo; la misma retorna un booleano que indica si se cargó o no el archivo:

 

  • TRUE: La subida del archivo fué exitosa y podemos obtener data de la carga del mismo mediante la función $this->upload->data().
  • FALSE: La subida del archivo NO fué exitosa y podemos obtener el error mediante la función $this->upload->display_errors().

Definiendo el controlador para la carga de una imagen

Si quisiéramos hacer el upload de una imagen podríamos utilizar el siguiente código en nuestro controller:

function cargar_archivo() {

    $mi_imagen = 'mi_imagen';
    $config['upload_path'] = "uploads/";
    $config['file_name'] = "nombre_archivo";
    $config['allowed_types'] = "gif|jpg|jpeg|png";
    $config['max_size'] = "50000";
    $config['max_width'] = "2000";
    $config['max_height'] = "2000";

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

    if (!$this->upload->do_upload($mi_imagen)) {
        //*** ocurrio un error
        $data['uploadError'] = $this->upload->display_errors();
        echo $this->upload->display_errors();
        return;
    }

    $data['uploadSuccess'] = $this->upload->data();
    }

Como puedes ver con el código anterior podemos realizar el upload de la imagen con php y CodeIgniter

También puedes revisar otro artículo en donde hablamos de cómo cargar o subir múltiples archivos con CodeIgniter y DropZone vía Ajax.

Extra: Escalando una imagen guardada o cargada

Una vez cargada, podemos disparar un proceso que se encargue de reescalar la imagen si el tipo de archivos que se está cargando es una imagen; para eso en el método cargar_archivo() al final del mismo verificamos en base a los datos de carga de la imagen, la extensión del archivo a cargar:

if ($data['file_ext'] == ".jpg" || $data['file_ext'] == ".png" || $data['file_ext'] == ".jpeg" || $data['file_ext'] == ".gif") {
	$this->foto_redimencionar($data['full_path'], $data['file_name'], $dir);
}

Finalmente, el método para reescalar la imagen:

private function foto_redimencionar($ruta, $nombre, $dir) {
	$config['image_library'] = 'gd2';
	$config['source_image'] = $ruta;
	$config['new_image'] = $dir . '/' . $nombre;
	$config['maintain_ratio'] = TRUE;
	$config['height'] = 300;

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

	if (!$this->image_lib->resize()) {
		echo $this->image_lib->display_errors();
	}
}

Enlaces de Interés

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.