CodeIgniter te proporciona ciertos helpers integrados para implementar funcionalidades realmente útiles en tu aplicación web. Download Helper es uno de ellos, te permite integrar la función de descarga de forma sencilla en CodeIgniter. En este tutorial veremos cómo descargar un fichero o una imagen desde la base de datos utilizando el Download Helper de CodeIgniter.
Download Helper cuenta con una función llamada force_download() que genera unos headers que fuerzan la descarga de información en tu equipo. Puedes descargar ficheros existentes en el servidor utilizando la función force_download(). Dicha función acepta 3 parámetros: $filename (string), $data (mixed) y $set_mime (boolean). Para descargar un fichero existente debes utilizar la función force_download() tal que asÃ:
force_download('/path/to/photo.jpg', NULL);
Aquà te proporcionamos un script de ejemplo para ver cómo descargar ficheros desde la base de datos en CodeIgniter. Implementaremos las siguientes funcionalidades en este script:
- Todos los archivos se listarán desde la base de datos ya que existe una carpeta donde se destinarán todas las subidas (uploads/files)
- Los archivos se mostrarán mediante una vista previa y un enlace de descarga
- Al hacer clic en el enlace “Download”, el archivo se descargará del directorio
Directorio de subida
Crea un directorio donde quieras almacenar los archivos subidos. Dichos archivos serán almacenados en el directorio uploads/files del directorio raÃz de la aplicación.
Creación de la base de datos
Para almacenar la información de los ficheros necesitamos una tabla MySQL. El siguiente SQL crea una tabla llamada files:
CREATE TABLE `files` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `file_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, `status` enum('1','0') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Controlador (Files.php)
El controlador Files gestiona el listado de ficheros y la función de descarga. Contiene tres funciones:
- __construct() - Se carga el modelo File para extraer los ficheros de la base de datos
- index() - Se extrae la información de los ficheros desde la BD utilizando el modelo File y se pasan a la vista
- download() - Descarga el respectivo fichero basándonos en el ID
En la función download(), se extrae la información de la base de datos y utilizamos la función force_download() para descarga el fichero del directorio.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * Files management class created by CodexWorld */ class Files extends CI_Controller { function __construct() { parent::__construct(); $this->load->model('file'); } public function index(){ $data = array(); //get files from database $data['files'] = $this->file->getRows(); //load the view $this->load->view('files/index', $data); } public function download($id){ if(!empty($id)){ //load download helper $this->load->helper('download'); //get file info from database $fileInfo = $this->file->getRows(array('id' => $id)); //file path $file = 'uploads/files/'.$fileInfo['file_name']; //download file from directory force_download($file, NULL); } } }
Modelo (File.php)
El modelo File gestiona todo lo relativo a la base de datos, y solo contiene una función: getRows(). La función getRows() obtiene todos los registros de la tabla files y devuelve los datos solicitados.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class File extends CI_Model{ /* * get rows from the files table */ function getRows($params = array()){ $this->db->select('*'); $this->db->from('files'); $this->db->where('status','1'); $this->db->order_by('created','desc'); if(array_key_exists('id',$params) && !empty($params['id'])){ $this->db->where('id',$params['id']); //get records $query = $this->db->get(); $result = ($query->num_rows() > 0)?$query->row_array():FALSE; }else{ //set start and limit if(array_key_exists("start",$params) && array_key_exists("limit",$params)){ $this->db->limit($params['limit'],$params['start']); }elseif(!array_key_exists("start",$params) && array_key_exists("limit",$params)){ $this->db->limit($params['limit']); } //get records $query = $this->db->get(); $result = ($query->num_rows() > 0)?$query->result_array():FALSE; } //return fetched data return $result; } }
Vista (files/index.php)
<?php if(!empty($files)){ foreach($files as $frow){ ?> <div class="file-box"> <div class="box-content"> <h5><?php echo $frow['title']; ?></h5> <div class="preview"> <embed src="<?php echo base_url().'uploads/files/'.$frow['file_name']; ?>"> </div> <a href="<?php echo base_url().'files/download/'.$frow['id']; ?>" class="dwn">Download</a> </div> </div> <?php } } ?>
Fuente: codexworld.com