Actualmente estoy comenzando a trabajar en una aplicación para compartir archivos para mi empresa. Un formulario simple para cargar un archivo, el usuario recibe una URL de descarga y puede pasarla a cualquier persona para que pueda descargar el archivo (similar a productos como WeTransfer).
Sin embargo, estoy luchando por decidir cómo hacerlo. He estado jugando con MongoDB y GridFS. He utilizado con éxito multer y multer-gridfs-storage para cargar archivos directamente en mi base de datos. Estoy luchando para que se descarguen, ya que no sé mucho sobre GridFS.
const storage = new GridFsStorage({ url: 'mongodb://localhost:27017/fileUpload', file: (req, file) => { return new Promise((resolve, reject) => { crypto.randomBytes(16, (err, buf) => { if (err) { return reject(err) } const filename = buf.toString('hex') + path.extname(file.originalname); const fileInfo = { filename: filename, bucketName: 'uploads' }; resolve(fileInfo) }); }); } }); const upload = multer({ storage })
Pero me hizo pensar si esta es la mejor manera de hacer esto o habría una mejor razón para servir esos archivos de descarga (para descargarlos en la computadora de un usuario).
¡Cualquier consejo es muy apreciado!
GridFS es una especificación para almacenar y recuperar archivos que exceden el límite de tamaño de documento BSON de 16 MB. GridFS es una convención implementada por todos los controladores MongoDB que almacena datos binarios en muchos documentos más pequeños. Los binarios se dividen en fragmentos y luego los fragmentos se almacenan en colecciones creadas por GridFS.
Habiendo dicho eso, dados los casos de uso presentados, recomendaría encarecidamente usar un servidor de medios para el almacenamiento dado el panorama de la aplicación, lo que hace que sea una solución más económica, viable y escalable.
Habiendo dicho eso, generalmente evitaría poner BLOB en la base de datos si hay otras opciones de almacenamiento que cuestan menos, ya que usar una base de datos como almacenamiento BLOB generalmente no es una solución optimizada en costos. Claro, hay razones válidas para almacenar blobs en la base de datos, pero dado el caso de uso de la aplicación (que requiere muchos medios), use el servidor de medios para el almacenamiento de archivos y las bases de datos para las estructuras de datos.
En tales casos, a menudo es fácil "desoptimizar los costos" con el tiempo. Además, el tamaño de la base de datos crecería exponencialmente con el tiempo, lo que traería sus propios desafíos con la administración de RAM (WiredTiger Cache).
En general, si fuera yo, usaría el almacenamiento de medios para aplicaciones intensivas de BLOB en lugar de depender de bases de datos.