Cómo descargar ficheros desde la base de datos en CodeIgniter

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

COMPARTE ESTE ARTÍCULO

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