Guía GridFS: Cómo cargar archivos e imágenes a MongoDB fácilmente usando Node

El almacenamiento de archivos es una característica importante requerida en múltiples procesos a través de varios tipos de aplicaciones. La existencia de procesos como Content Delivery Networks (CDNs), configurados a través de opciones en la nube de terceros como Amazon Web Services, y las opciones de almacenamiento de archivos locales siempre han facilitado la creación de dicha función.

Sin embargo, el concepto de almacenar archivos directamente en una base de datos a través de una sola llamada a la API me había intrigado durante bastante tiempo. Ahí es donde GridFS entró en escena para mí.

GridFS: la comprensión de un profano

MongoDB tiene una especificación de controlador para cargar y recuperar archivos llamada GridFS. GridFS le permite almacenar y recuperar archivos, incluidos los que superan el límite de tamaño de documento BSON de 16 MB .

GridFS básicamente toma un archivo y lo divide en varios fragmentos que se almacenan como documentos individuales en dos colecciones:

  • la chunkcolección (almacena las partes del documento), y
  • la filecolección (almacena los metadatos adicionales consiguientes).

Cada fragmento está limitado a 255 KB de tamaño. Esto significa que el último fragmento normalmente es igual o inferior a 255 KB. Suena bastante bien.

Cuando lee desde GridFS, el controlador vuelve a ensamblar todos los fragmentos según sea necesario. Esto significa que puede leer secciones de un archivo según su rango de consulta. Como escuchar un segmento de un archivo de audio o recuperar una sección de un archivo de video.  

Nota: se prefiere utilizar GridFS para almacenar archivos que normalmente superan el límite de tamaño de 16 MB. Para archivos más pequeños, se recomienda utilizar el formato BinData para almacenar los archivos en documentos individuales.

Esto resume cómo funciona GridFS en general. Es hora de sumergirnos en algún código de trabajo y ver cómo implementar un sistema como tal.

Basta de hablar, muéstrame el código

Estamos usando Node.js con acceso a una instancia en la nube de MongoDB para nuestra configuración. Puede encontrar el repositorio de código para la aplicación de muestra aquí.

tarique93102 / gridfs-file-storage Contribuya al desarrollo de tarique93102 / gridfs-file-storage creando una cuenta en GitHub. tarique93102 GitHub

Nos centraremos completamente en los segmentos del código que se relacionan con las funcionalidades de GridFS. Aprenderemos cómo configurarlo y usarlo para almacenar archivos, recuperar archivos o un archivo en particular y eliminar un archivo en particular. Empecemos entonces.

Inicializar el motor de almacenamiento

Los paquetes necesarios para inicializar el motor son multer-gridfs-storagey multer. También usamos method-overridemiddleware para habilitar la operación de eliminación de archivos. El módulo npm cryptose utiliza para cifrar los nombres de archivo al ser almacenados y leídos de la base de datos.

Una vez que se inicializa el motor de almacenamiento que usa GridFS, solo tiene que llamarlo usando el middleware multer. Luego se pasa a la ruta respectiva ejecutando las diversas operaciones de almacenamiento de archivos.

Inicializar la secuencia GridFS

Inicializamos una secuencia GridFS como se ve en el código a continuación. La secuencia es necesaria para leer los archivos de la base de datos y también para ayudar a representar una imagen en un navegador cuando sea necesario.

Cargar un solo archivo o imagen

Reutilizamos el middleware de carga que habíamos creado anteriormente.  

Nota: El nombre filese usa como parámetro en upload.single()  ya que tenemos la clave con un nombre similar que lleva el archivo que se envía desde el cliente.

Cargar varios archivos o imágenes

También podemos subir varios archivos a la vez. En lugar de upload.single(), simplemente tenemos que usar upload.multiple().

Nota: La cantidad de archivos cargados puede ser menor que la cantidad definida de archivos.

Obtener todos los archivos de la base de datos

Usando la secuencia inicializada, podemos recuperar todos los archivos en la base de datos particular usando gfs.find().toArray(...). Una vez que se obtienen los archivos, lo asignamos a una matriz y enviamos la respuesta.

Obtener un solo archivo por nombre de archivo

Es muy simple consultar GridFS para un solo archivo basado en un atributo específico como filename. Usando la secuencia GridFS, puede consultar la base de datos a través de la función gfs.find({}).

Renderizar una imagen obtenida en el navegador

Esta es una parte un poco más complicada, ya que no solo debe obtener un archivo de la base de datos, sino también representarlo como una imagen en el navegador correspondiente. Recuperamos el archivo normalmente. Ningún cambio en ese proceso.

Luego, con la ayuda del método openDownloadStreamByName()en gfs stream, podemos renderizar fácilmente una imagen, ya que devuelve un flujo legible. Una vez hecho esto, podemos usar JavaScript pipe()para transmitir la respuesta.

Eliminar un archivo en particular por ID

Eliminar un archivo es igualmente sencillo. Usamos el método de flujo delete()con _idparámetro para consultar y eliminar el archivo en cuestión.

Estas son las principales funcionalidades que ofrece el diseño del motor de almacenamiento. Aproveché las características de GridFS discutidas para crear una aplicación de carga de imágenes simple. Puede profundizar en el código en el repositorio.

Conclusión

Me tomó algo de tiempo y una buena cantidad de esfuerzo entender cómo hacer uso de GridFS para un proyecto personal. Debido a esto, quería asegurarme de que al menos otra persona no tuviera que invertir la misma cantidad de tiempo.

Habiendo dicho eso, recomendaría usar GridFS con precaución. No es una solución milagrosa para todas sus preocupaciones sobre el almacenamiento de archivos. Aún así, es una especificación ingeniosa para conocer y tener en cuenta.  

Si tiene alguna consulta o inquietud, puede comentar en la publicación o comunicarse conmigo en LinkedIn.

Mientras tanto, sigue codificando.