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:

Comentarios

Entradas populares