Generar imagenes dinámicamente en CodeIgniter
A veces nos puede interesar crear imágenes dinámicamente a partir de alguna que ya tengamos alojada en nuestro servidor, a continuación veremos como hacerlo con la ayuda de CodeIgniter.
Una imagen generada dinámicamente puede tener varias ventajas como por ejemplo:
- Podemos controlar fácilmente cuanta gente la esta viendo
- Restringir la visión de esta a los usuarios que queramos
- Evitar que los usuarios tengan acceso a la imagen original
- Poder generar una imagen del tamaño que queramos según convenga
- Generar thumbnails, o modificaciones de la imagen original sin tener que generar copias
Esta ultima ventaja también nos trae a la desventaja, según lo que queramos, ya que al generar una imagen dinámicamente en PHP lo que estamos haciendo es aligerar la carga en el disco duro pero augmentar el tamaño del procesamiento, con lo que estamos cargando al servidor.
Subidor de Imagenes (Tercera parte): Subir y miniaturizar
Bueno seguimos con lo del ultimo día. Ahora lo que nos queda hacer es el controlador que se ocupe de subir nuestro fichero en el servidor y luego cree una imagen en miniatura de esta (thumbnail).
Como ya dije en el articulo anterior, usaremos estas dos librerías: File Uploading Class y Image Manipulation Class.
Al ser un solo formulario lo haremos todo en una misma función del controlador. Para empezar necesitaremos subir el archivo al servidor y a su vez almacenar la información en la base de datos:
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '5000';
$config['encrypt_name'] = TRUE;
$this->load->library('upload', $config);
if(!$this->upload->do_upload("imagen"))
{
echo $this->upload->display_errors();
}
else
{
$data = $this->upload->data();
$this->db->query("INSERT INTO `imagenes` (`imagen`, `fecha`, `ip`) VALUES (?, ?, ?)", array($data['file_name'], time(), $_SERVER['REMOTE_ADDR']));
Como veis es muy fácil de usar, hay que especificar las distintas opciones que queremos en el array config (hay mas opciones disponibles en la guía de usuario de CI). Le pasamos el "name" input del formulario para subir la imagen en la función "do_upload". Y luego simplemente añadir un registro en la base de datos con la información que nos da "$this->upload->data()";
Ahora necesitaremos que a partir de esta imagen se cree un thumbnail, lo haremos así:
Subidor de Imagenes (Segunda parte): Base de datos y vistas
Como siempre, el taller para esta aplicación ira enfocado a conseguir una idea o noción básica sobre el tema, es decir yo os doy una base para que podáis trabajarla y ampliarla según vuestras necesidades.
Dicho esto empezaremos creando la tabla de la base de datos que necesitaremos, como he dicho todo muy simplificado. Necesitaremos un campo que nos diga el nombre de la imagen, otro de ID, uno de fecha y otro de IP para saber desde donde nos suben esas imágenes, por si hubiese abuso esta sería una buena medida de controlarlo.
CREATE TABLE IF NOT EXISTS `imagenes` ( `id` int(11) NOT NULL auto_increment, `imagen` char(255) NOT NULL, `fecha` int(11) NOT NULL, `ip` char(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Como veis es todo bastante simple. Podríais añadir campos como el nombre original de la imagen (dado que vamos a modificar su nombre por un hash), tamaño, en caso de que lo hagáis con usuarios pues la ID del usuario y un largo etcétera.
Después de crear la base de datos necesitaremos tener las vistas, es decir lo que el usuario verá. Primero crearemos el formulario para subir la imagen, muy simple, con un simple campo de archivo para que nos suban la imagen.
<fieldset>
<legend>Subir imagen</legend>
<form action="index.php/imagenes/index/do" method="post" enctype="multipart/form-data">
<label for="imagen">Imagen</label>
<input type="file" name="imagen" id="imagen" />
<br />
<label></label>
<input type="submit" value="Subir" />
</form>
</fieldset>
Luego crearemos la vista donde se informara al usuario del éxito al subir su fichero y la típica información como podría ser el link, el código para los foros (BBCode) para incluir la imagen con su miniatura, etc..
<p><strong>Tu imagen se ha subido correctamente!</strong></p>
<p>
<strong>Link de tu imagen</strong>
<br />
<a href="<?=base_url();?>uploads/< ?=$file_name?>">< ?=base_url();?>uploads/< ?=$file_name?></a>
</p>
<p>
<strong>Para foro</strong>
<br />
<textarea cols="50" rows="5">[url=< ?=base_url();?>uploads/< ?=$file_name?>][img]< ?=base_url();?>uploads/< ?=$file_name?>[/img][/url]</textarea>
</p>
<p>
<strong>Para foro con miniatura</strong>
<br />
<a href="<?=base_url();?>uploads/< ?=$file_name?>"><img src="<?=base_url();?/>uploads/< ?=$raw_name?>_thumb< ?=$file_ext?>" /></a>
<br />
<textarea cols="50" rows="5">[url=< ?=base_url();?>uploads/< ?=$file_name?>][img]< ?=base_url();?>uploads/< ?=$raw_name?>_thumb< ?=$file_ext?>[/img][/url]</textarea>
</p>
Como veréis, uso algunas variables como $file_name que son un array de variables que nos devolverá la función de UPLOAD (subir el fichero) de la librería de CodeIgniter, por el momento os lo creéis y lo veremos en el siguiente artículo. Aun así si queréis ver que variables se nos devuelven y como funciona por encima la librería podéis verlo aquí.
Hasta la siguiente parte ;)
