Subir múltiples ficheros e imágenes en CodeIgniter

La clase Upload de Codeigniter te permite subir ficheros al servidor. Es decir, puedes subir un único fichero o una imagen al servidor mediante esta librería. Pero es cierto que, si queremos subir múltiples ficheros a nuestra aplicación tendremos que hacer ciertos retoques en nuestro código. Este artículo te ayudará a subir múltiples ficheros e imágenes a la vez utilizando la librería Upload de CodeIgniter. También veremos cómo insertar la información de los ficheros subidos en la base de datos.

En el script de ejemplo veremos cómo mostrar un formulario de subida de ficheros donde el usuario pueda escoger varios ficheros a la vez. Una vez se haga clic en el botón de subir, todos los archivos e imágenes se subirán a la carpeta específica y su información se insertará en la base de datos.

Creación de la tabla de la base de datos

Primero tenemos que crear una tabla llamada files para almacenar la información sobre los ficheros en la base de datos (codeigniter_db). El script SQL para crear la tabla sería algo así:

CREATE TABLE `files` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `file_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `created` datetime NOT NULL COMMENT 'Upload Date',
 `modified` datetime NOT NULL,
 `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1=Unblock, 0=Block',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Crea un directorio en tu servidor donde quieras que se guarden los archivos subidos. Por ejemplo, puedes crear un directorio en uploads/files en el directorio raíz de la aplicación.

Codeigniter
> application
> system
> uploads
>> files

Controlador (Upload_files.php)

__construct(): En esta función, cargaremos el modelo File que nos ayudará a obtener la información de la base de datos y a insertar la información de los ficheros en la base de datos.

index(): Esra función muestra todas las imágenes que ya están subidas. Una vez se haga submit en el formulario, los ficheros se subirán a la carpeta que hayamos designado para ello utilizando la librería Upload y se instará la información de los ficheros utilizando el modelo File.

<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Upload_Files extends CI_Controller
{
    function  __construct() {
        parent::__construct();
        $this->load->model('file');
    }
    
    function index(){
        $data = array();
        if($this->input->post('fileSubmit') && !empty($_FILES['userFiles']['name'])){
            $filesCount = count($_FILES['userFiles']['name']);
            for($i = 0; $i < $filesCount; $i++){
                $_FILES['userFile']['name'] = $_FILES['userFiles']['name'][$i];
                $_FILES['userFile']['type'] = $_FILES['userFiles']['type'][$i];
                $_FILES['userFile']['tmp_name'] = $_FILES['userFiles']['tmp_name'][$i];
                $_FILES['userFile']['error'] = $_FILES['userFiles']['error'][$i];
                $_FILES['userFile']['size'] = $_FILES['userFiles']['size'][$i];

                $uploadPath = 'uploads/files/';
                $config['upload_path'] = $uploadPath;
                $config['allowed_types'] = 'gif|jpg|png';
                
                $this->load->library('upload', $config);
                $this->upload->initialize($config);
                if($this->upload->do_upload('userFile')){
                    $fileData = $this->upload->data();
                    $uploadData[$i]['file_name'] = $fileData['file_name'];
                    $uploadData[$i]['created'] = date("Y-m-d H:i:s");
                    $uploadData[$i]['modified'] = date("Y-m-d H:i:s");
                }
            }
            
            if(!empty($uploadData)){
                //Insert file information into the database
                $insert = $this->file->insert($uploadData);
                $statusMsg = $insert?'Files uploaded successfully.':'Some problem occurred, please try again.';
                $this->session->set_flashdata('statusMsg',$statusMsg);
            }
        }
        //Get files data from database
        $data['files'] = $this->file->getRows();
        //Pass the files data to view
        $this->load->view('upload_files/index', $data);
    }

}

Hemos establecido las preferencias básicas en la librería Upload ($config), pero puedes configurarla aún más. Si quieres consultar la lista de preferencias, puedes echar un ojo a este enlace: https://ellislab.com/codeigniter/user-guide/libraries/file_uploading.html

Modelo (File.php)

El modelo File contiene dos funciones getRows() e insert(). La función getRows() la utilizaremos para leer la información de los ficheros de la base de datos y devolverla en forma de array. La función insert() la utilizaremos para inserta la información de los ficheros en la base de datos.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class File extends CI_Model{

    public function getRows($id = ''){
        $this->db->select('id,file_name,created');
        $this->db->from('files');
        if($id){
            $this->db->where('id',$id);
            $query = $this->db->get();
            $result = $query->row_array();
        }else{
            $this->db->order_by('created','desc');
            $query = $this->db->get();
            $result = $query->result_array();
        }
        return !empty($result)?$result:false;
    }
    
    public function insert($data = array()){
        $insert = $this->db->insert_batch('files',$data);
        return $insert?true:false;
    }
    
}

Vista (upload_files/index.php)

En el archivo de la vista, mostraremos el formulario de subida de archivos con un campo upload y un botón de submit. Debajo del formulario de subida, se mostrarán las imágenes y archivos que ya hayas subido.

<div class="container">
    <div class="row">
        <p><?php echo $this->session->flashdata('statusMsg'); ?></p>
        <form enctype="multipart/form-data" action="" method="post">
            <div class="form-group">
                <label>Choose Files</label>
                <input type="file" class="form-control" name="userFiles[]" multiple/>
            </div>
            <div class="form-group">
                <input class="form-control" type="submit" name="fileSubmit" value="UPLOAD"/>
            </div>
        </form>
    </div>
    <div class="row">
        <ul class="gallery">
            <?php if(!empty($files)): foreach($files as $file): ?>
            <li class="item">
                <img src="<?php echo base_url('uploads/files/'.$file['file_name']); ?>" alt="" >
                <p>Uploaded On <?php echo date("j M Y",strtotime($file['created'])); ?></p>
            </li>
            <?php endforeach; else: ?>
            <p>Image(s) not found.....</p>
            <?php endif; ?>
        </ul>
    </div>
</div>

Configuración (autoload.php)

Necesitamos cargar alguna librería del sistema y un helper para este script de ejemplo. Abre el archivo config/autoload.php y especifica la librería (sesión, base de datos) y el helper (url) que se utilizan en esta aplicación.

$autoload['libraries'] = array('session','database');

$autoload['helper'] = array('url');

Fuente: codexworld.com

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP