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