2025-03-27 - San Ruperto de Worms y otros... |      623029155    info@evainformatica.es  Contacta
Blog

Carga o upload de archivos con CodeIgniter

Andrés Cruz en Udemy | 2022-09-25 | 0 comentarios

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:


	
	method="post" enctype="multipart/form-data">


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:

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:

Preferencia Valor por defecto Opciones Descripción
upload_path None None La carpeta destino donde será cargado el archivo; asegúrese que la carpeta tenga permisos de escritura y la ruta empleada en la misma debe ser absoluta o relativa y no una URL.
allowed_types None None El mime del archivo; si vas a especificar más de una debes de separarlos por pipes ('|').
file_name None   El nombre que tendrá el archivo al ser depositado en la carpeta.
overwrite FALSE TRUE/FALSE (boolean) TRUE para sobrescribir archivos con el mismo nombre en la carpeta destino y FALSE en caso contrario.
max_size 0 None El máximo tamaño (en kilobytes) que puede tener el archivo. Establecer en cero para que no haya límites.
max_width 0 None En 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_height 0 None En 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_filename 0 None La máxima longitud que puede tener el nombre del archivo; cero para no establecer un límite.
encrypt_name FALSE TRUE/FALSE (boolean) TRUE para que el archivo sea encriptado.
remove_spaces TRUE TRUE/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

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();
	}
}


Comentar este artículo


Al enviar estás aceptando la Política de privacidad de evainformatica.es