Cómo almacenar archivos en una base de datos MySQL

Inicio / Cómo hacer para... / Cómo almacenar archivos en una base de datos MySQL

Un clásico problema de una aplicación web es el almacenamiento de archivos subidos por los usuarios (Sus fotos por ejemplo).

Si bien teóricamente se puede realizar sin mayores inconvenientes (Al fin y al cabo, un archivo digital no es más que una colección de datos binarios), es sumamente ineficiente hacerlo (Como vimos en el curso sobre Programación web con Bases de datos).

Veamos cómo sería esto:

Primero que nada, habría que manejar de alguna forma el upload de archivos, pero, asumiendo que el archivo ya está disponible para php se podría pensar en almacenarlo dentro de la base de datos utilizando algún campo tipo BLOB.

Un problema inmediato que surge de tomar esta opción es que la base de datos crecerá mucho si el sistema es muy utilizado, lo cual impactará negativamente en su rendimiento, hará más costozos los backups, etc…

Una alternativa simple es guardar, en lugar del contenido del archivo, su localización (Puede ser la ruta al archivo, si está guardado en algún medio de almacenamiento, ya sea el disco local o alguno externo, como S3 por ejemplo).

De esa forma se logra aislar a la base de datos del manejo de información que, por otro lado, tampoco será sencilla de consultar y, a la vez, permite aprovechar capacidades del medio de almacenamiento elegido (Incluso hace mucho más simple la introducción de alguna capa de caché como ser un CDN).

Si lo que buscas es realizar búsquedas dentro del contenido de archivos de texto, lo mejor que puedes hacer es usar alguna otra herramienta como Solr, ElasticSearch o Sphinx (Por nombrar sólo algunos).

Si, de cualquier forma decides guardar el contenido del archivo directo en la base de datos, te recomiendo guardarlo con alguna forma de codificación que prevenga problemas con los caracteres especiales (acentos, eñes, etc…), por ejemplo base64 o algún formato comprimido (Zip por ejemplo).

En general diría que los datos que se almacenan en la base deberían ser (al menos en su gran mayoría) de naturaleza dinámica (Es decir, que pueden cambiar a lo largo del tiempo). Aquellos datos que permanecerán estáticos probablemente tengan un mejor lugar donde residir.

Por último, ¿pensaste en cómo mostrarías la foto si lo que está guardado en la base es el contenido del archivo en lugar de su ruta?.

En el caso de que tomes mi sugerencia es bien fácil, basta con algo como:

<img src="<?php echo $usuario['foto']; ?>"/>

Si en cambio lo que está guardado en la base es el contenido del archivo… no es que sea imposible, claro, pero seguro que es algo más complicado (Tal vez tengas que hacer un script que devuelva los datos binarios de la foto o algo así)… ¿para qué hacer las cosas más difíciles de lo que debe ser?

mchojrin

Director Académico y Docente at Leeway Academy
Hola! Soy Mauro Chojrin, estudié la Lic. en Ciencias de la Computación en la Universidad de Buenos Aires.

Me desempeño como docente de programación desde el año 1997.

Pasé por diferentes instituciones (Escuela Técnica ORT, Digital House, EducacionIT, ITMaster, Escuela DaVinci entre otros).

Actualmente coordino los cursos dictados en Leeway Academy y desarrollo sistemas usando PHP y framework Symfony

2 comentarios

    • Hola Mike:

      Definitivamente lo más recomendable es guardar la ruta. De esa forma:

      1. Ahorras espacio en la base de datos (Que igualmente no serviría de mucho ya que hacer búsquedas por el contenido de un archivo sería sumamente ineficiente)
      2. Te reservas el derecho de modificar el modo de almacenar los archivos posteriormente (Por ejemplo, en una primera instancia puedes guardarlos en el mismo servidor donde está tu aplicación pero luego podrías preferir usar otro tipo de almacenamiento como S3)

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: