Non è necessario GridFS per file di dimensioni inferiori a 16 MB. Puoi archiviare i dati binari direttamente in MongoDB utilizzando tipo binario di BSON oppure codifica i tuoi dati binari e archiviali come stringa. Base64 è una scelta di codifica comune quando si archiviano dati binari come stringhe.
Una volta recuperati i dati dal database, puoi scriverli in un file utilizzando fs.writeFile
.
Se hai salvato i tuoi dati come tipo binario, puoi passare un buffer
in fs.writeFile
. Se hai salvato i tuoi dati come stringa codificata, puoi passare una stringa e una encoding
opzione.
(Se desideri pubblicare il file con Express, puoi impostare il tipo di contenuto e inviare i dati utilizzando res.send
)
Ecco un piccolo esempio in NodeJS. Questo legge un file audio dal disco, lo salva in un database MongoDB come tipo binario (usando il driver MongoDB Binario class), lo recupera dal database e lo scrive in un nuovo file su disco.
const mongodb = require('mongodb')
const util = require('util')
const fs = require('fs')
const readFile = util.promisify(fs.readFile)
const writeFile = util.promisify(fs.writeFile)
async function main() {
const client = await mongodb.MongoClient.connect(process.env.MONGO_URI)
console.log('connected')
let db = await client.db('dbname')
// Reading in binary data from a file. data is a buffer.
let data = await readFile(__dirname + '/sample.mp3')
// Insert binary data to the database
let res = await db.collection('coll').insert({data: new mongodb.Binary(data)})
console.log(res)
let objectId = res.ops[0]._id
// Retrieve binary data from the database
let obj = await db.collection('coll').findOne({_id: objectId})
console.log(obj)
// *** This is the key part ***
// use obj.data.read to get a buffer from the binary data and write that buffer to a file
await writeFile(__dirname + '/out.mp3', obj.data.read(0, obj.data.length()))
console.log('done')
}
main()
Sebbene le persone memorizzino i dati binari nel database, è probabilmente più comune per le persone archiviare i file in un file system o in uno storage di oggetti (come Amazon S3). Quindi memorizzerebbero semplicemente un collegamento a quel file nel database e recupereranno quel file utilizzando il collegamento. Puoi fare quello con cui ti senti più a tuo agio.