async deleteFile(filename: string) { const bucket = await this._getBucket(); const documents = await bucket.find({ filename }).toArray(); if (documents.length === 0) { throw new Error('FileNotFound'); } return Promise.all( documents.map((doc) => { return bucket.delete(doc._id); }) ); }
it('properly overrides files', async () => { const gfsAdapter = new GridFSBucketAdapter(databaseURI); await gfsAdapter.createFile('myFileName', 'a simple file'); await gfsAdapter.createFile('myFileName', 'an overrided simple file'); const data = await gfsAdapter.getFileData('myFileName'); expect(data.toString('utf8')).toBe('an overrided simple file'); const bucket = await gfsAdapter._getBucket(); const documents = await bucket.find({ filename: 'myFileName' }).toArray(); expect(documents.length).toBe(2); await gfsAdapter.deleteFile('myFileName'); await expectMissingFile(gfsAdapter, 'myFileName'); });
// For a given config object, filename, and data, store a file // Returns a promise async createFile(filename, data, contentType, options = {}) { const bucket = await this._getBucket(); const stream = await bucket.openUploadStream(filename, { metadata: options.metadata }); if (this._fileKey !== null) { const iv = crypto.randomBytes(16); const cipher = crypto.createCipheriv(this._algorithm, this._fileKey, iv); const encryptedResult = Buffer.concat([cipher.update(data), cipher.final(), iv, cipher.getAuthTag()]); await stream.write(encryptedResult); } else { await stream.write(data); } stream.end(); return new Promise((resolve, reject) => { stream.on('finish', resolve); stream.on('error', reject); }); }
async getFileData(filename) { const bucket = await this._getBucket(); const stream = bucket.openDownloadStreamByName(filename); stream.read(); return new Promise((resolve, reject) => { const chunks = []; stream.on('data', data => { chunks.push(data); }); stream.on('end', () => { const data = Buffer.concat(chunks); if (this._fileKey !== null) { const authTagLocation = data.length - 16; const ivLocation = data.length - 32; const authTag = data.slice(authTagLocation); const iv = data.slice(ivLocation, authTagLocation); const encrypted = data.slice(0, ivLocation); const decipher = crypto.createDecipheriv(this._algorithm, this._fileKey, iv); decipher.setAuthTag(authTag); return resolve(Buffer.concat([decipher.update(encrypted), decipher.final()])); } resolve(data); }); stream.on('error', err => { reject(err); }); }); }
async handleFileStream(filename, req, res, contentType) { const bucket = await this._getBucket(); const files = await bucket.find({ filename }).toArray(); 'Content-Type': contentType }); const stream = bucket.openDownloadStreamByName(filename); stream.start(start); stream.on('data', chunk => {
async getMetadata(filename) { const bucket = await this._getBucket(); const files = await bucket.find({ filename }).toArray(); if (files.length === 0) { return {}; } const { metadata } = files[0]; return { metadata }; }
app.get('/api/:id', (req, res) => { var bucket = new mongodb.GridFSBucket(mydb, { bucketName: 'ls-config', }) var downStream = bucket.openDownloadStream(req.params.id); downStream.pipe(res); })
function getTrack(req, res) { try { const trackID = new ObjectID(req.params.trackID); res.set('content-type', 'audio/mp3'); res.set('accept-ranges', 'bytes'); getDatabase().then((db) => { const bucket = new mongodb.GridFSBucket(db, { bucketName: 'tracks', }); const downloadStream = bucket.openDownloadStream(trackID); downloadStream.on('data', (chunk) => { res.write(chunk); }); downloadStream.on('error', () => { res.sendStatus(404); }); downloadStream.on('end', () => { res.end(); }); }); } catch (err) { return res.status(400).json({ message: 'Invalid trackID in URL parameter. Must be a single String of 12 bytes or a string of 24 hex characters' }); } }
/** * GET /tracks/:trackID */ trackRoute.get('/:trackID', (req, res) => { try { var trackID = new ObjectID(req.params.trackID); } catch(err) { return res.status(400).json({ message: "Invalid trackID in URL parameter. Must be a single String of 12 bytes or a string of 24 hex characters" }); } res.set('content-type', 'audio/mp3'); res.set('accept-ranges', 'bytes'); let bucket = new mongodb.GridFSBucket(db, { bucketName: 'tracks' }); let downloadStream = bucket.openDownloadStream(trackID); downloadStream.on('data', (chunk) => { res.write(chunk); }); downloadStream.on('error', () => { res.sendStatus(404); }); downloadStream.on('end', () => { res.end(); }); });
}); let uploadStream = bucket.openUploadStream(trackName); let id = uploadStream.id; readableTrackStream.pipe(uploadStream);
async deleteFile(filename) { const bucket = await this._getBucket(); const documents = await bucket.find({ filename }).toArray(); if (documents.length === 0) { throw new Error('FileNotFound'); } return Promise.all(documents.map(doc => { return bucket.delete(doc._id); })); }
async getMetadata(filename) { const bucket = await this._getBucket(); const files = await bucket.find({ filename }).toArray(); if (files.length === 0) { return {}; } const { metadata } = files[0]; return { metadata }; }
// For a given config object, filename, and data, store a file // Returns a promise async createFile(filename: string, data, contentType, options = {}) { const bucket = await this._getBucket(); const stream = await bucket.openUploadStream(filename, { metadata: options.metadata, }); if (this._fileKey !== null) { const iv = crypto.randomBytes(16); const cipher = crypto.createCipheriv(this._algorithm, this._fileKey, iv); const encryptedResult = Buffer.concat([ cipher.update(data), cipher.final(), iv, cipher.getAuthTag(), ]); await stream.write(encryptedResult); } else { await stream.write(data); } stream.end(); return new Promise((resolve, reject) => { stream.on('finish', resolve); stream.on('error', reject); }); }
async handleFileStream(filename: string, req, res, contentType) { const bucket = await this._getBucket(); const files = await bucket.find({ filename }).toArray(); if (files.length === 0) { throw new Error('FileNotFound'); 'Content-Type': contentType, }); const stream = bucket.openDownloadStreamByName(filename); stream.start(start); stream.on('data', (chunk) => {
async getFileData(filename: string) { const bucket = await this._getBucket(); const stream = bucket.openDownloadStreamByName(filename); stream.read(); return new Promise((resolve, reject) => {