Guardar Imagenes en un servidor Web (PHP y MySQL)
Como guardar datos de imágenes en DB.
Esta cuestión es muy importante en el
desarrollo de paginas web ya que el utilizar imágenes es de gran ayuda para
complementar las explicaciones dadas en texto, dar identidad y personalización
a los usuarios en la parte de login, etc. Esta cuestión como casi todas las
referentes a la carrera de desarrollador ya han sido aclaradas en Stackoverflow,
donde un usuario pregunto si es posible guardar imágenes en la base de datos
MySQL.
Si ya se tiene experiencia con este gestor
de bases de datos lo más fácil es que se hayan topado con el archivo BLOB (Gran
Objeto Binario en español) que es un tipo de dato especial que permite
almacenar datos binarios; cuando se dice datos binarios podemos abarcar gran
cantidad de datos como lo son imágenes, multimedia y PDF. Teniendo este tipo de
dato cuatro variantes las cuales son TINYBLOB, BLOB, MEDIUMBLOB y LONGBLOB que
como sus nombres sugieren tienen diferentes tamaños TINYBLOB 0,255 kb, BLOB 64
kb, MEDIUMBLOB 16 MB y LONGBLOB 4 GB.
Aunque pueda parecer intuitivo usar los BLOB de MySQL lo cierto es que hay grandes inconvenientes en especial si la aplicación web tiene muchos usuarios o no se esta utilizando alguna alternativa como Redis para almacenar los recursos mas solicitados; estas desventajas son:
- No todas las bases de datos permiten el uso de BLOB (inconvenientes al migrar de servidores/ sistema gestor de base de datos).
- Los BLOB ocupan una gran cantidad de espacio en disco, así como el tiempo de acceso a estos es tardado (dependiendo del tráfico y el tamaño).
- Dificulta la realización de copias de seguridad.
Según el usuario FinalForm en Stackoverflow,
aunque esto es posible es poco recomendado, en su respuesta menciona las
desventajas antes mencionadas; pero también el hecho de que lo aconsejable siguiendo
las buenas practicas seria crear un directorio en el proyecto y solo guardar la
ruta a dichos directorios en la base de datos remarcando que en los 13 años de
experiencia (cuando escribió la respuesta) ha demostrado que esta forma es la
mejor práctica.
Cómo cargar imágenes en una aplicación web.
Para cargar imágenes en una pagina web
basada en PHP se debe:
Crear un formulario en el HTML con el método
POST, además de la etiqueta enctype="multipart/form-data" esta
permitirá que el método POST transporte en varias partes los datos del
formulario (en caso de que se necesiten datos y archivos); esta propiedad no
afecta al formulario por lo que es recomendable habilitarla siempre.
En el action PHP estará un sentencia
if que verificará 4 posibles errores, isset($_FILES) que comprueba que archivos
hallan sido enviados por el formulario, isset($_FILES['fichero_subido'])
comprueba que el input file con en name fichero_subido fue enviado, !empty($_FILES['fichero_subido']['name'])
comprueba que el nombre del fichero tenga un nombre y por ultimo !empty($_FILES['fichero_subido']['tmp_name'])
que se ha movido a la carpeta temporal de PHP sin errores.
En el primer segundo if se encuentra la instruccion que verifica que el archivo de la carpeta temporal no En el primer segundo if se encuentra la instrucción que verifica que el archivo de la carpeta temporal no fuera inyectado mediante una falla de seguridad mediante la instrucción is_uploaded_file, de ser así se imprime un mensaje de error.
Después se guarda la ruta del archivo de la carpeta y se crea la ruta absoluta en la que se moverá el archivo en el servidor usando __DIR__.
El tercer if comprueba que no existe un archivo llamado de esa
forma en la ruta final con este nombre, de ser así se borra el archivo de la
carpeta temporal; en un caso en producción seria conveniente concatenar al string
de nombre una cadena alfanumérica aleatoria única; idealmente con una instrucción
como bin2hex(openssl_random_pseudo_bytes($bytes))
Finalmente se comprueba que el mover la imagen del directorio
temporal al de la carpeta final se ha completado correctamente, con la anotación
@ se esta indicando a PHP que la no tiene que manejar la excepción y finalmente
se imprime la ruta absoluta de la imagen en el servidor.
Cómo obtener las imágenes de la DB.
Si bien en este ejemplo no se utilizo la
base de datos como tal la implementación no variaría mucho al sustituir el
__DIR__ por la función dirname() siendo un ejemplo la siguiente imagen donde la
tabla tiene codImage que es el ID, un nombre que seria el título de la imagen que
se va ha mostrar y la ruta relativa en el proyecto.
Fuentes de Información:
- https://stackoverflow.com/questions/6472233/can-i-store-images-in-mysql
- https://www.digitalocean.com/community/tutorials/how-to-use-the-mysql-blob-data-type-to-store-images-with-php-on-ubuntu-18-04-es
- https://dev.mysql.com/doc/refman/8.0/en/blob.html
- https://www.ionos.mx/digitalguide/paginas-web/desarrollo-web/blob-binary-large-object/
- https://www.youtube.com/watch?v=k2wBkpFQezI&ab_channel=OpenWebinars
Comentarios
Publicar un comentario