Carga o upload de archivos con CodeIgniter 3
- Andrés Cruz
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 tipofile
; 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:
Preferencia | Valor por defecto | Opciones | Descripción |
---|---|---|---|
upload_path | None | None | La 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_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
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
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter