Используя gridfs-stream записать строку в gridfs
Я пришел через фрагмент кода, чтобы записать файл в gridfs, но я не могу найти способ записи для обновления строки в Gridfs.
приведенный ниже фрагмент будет обновляться с использованием пути, но как насчет прямого строкового буфера?
var metadata = {
"path": path
};
var writestream = gfs.createWriteStream({
filename: name,
mode: 'w',
content_type: type,
metadata: metadata
});
fs.createReadStream(path).pipe(writestream);
// var buf = new Buffer("hello");
writestream.on('close', function (file) {
console.log("Gridfs created");
});
3 ответа
Эта страница появляется первой при поиске способов хранения строковых данных в Mongo GridFS с использованием NodeJS. Поскольку большинство ответов здесь и в других местах основаны на устаревшем API, я решил опубликовать код, основанный на более позднем GridFSBucket. В коде есть дополнительное условие для перезаписи существующих файлов. Если вам это не нужно - вы можете заменить openUploadStreamWithId на openUploadStream, который создает дубликаты.
var mongo = require('mongodb');
var stream = require('stream');
var MongoClient = mongo.MongoClient;
function getFileSystemItem(dbo, filename) {
var buf = new Buffer('');
return new Promise(function(resolve, reject) {
var bucket = new mongo.GridFSBucket(dbo);
var readstream = bucket.openDownloadStream(filename);
readstream.on('data', (chunk) => {
buf = Buffer.concat([buf, chunk]);
});
readstream.on('error', (err) => {
reject(err);
});
readstream.on('end', () => {
var res = buf.toString();
buf = null; // Clean up memory
readstream.destroy();
resolve(res);
});
});
}
function putFileSystemItem(dbo, filename, data) {
var putItemHelper = function(bucket, resolve, reject) {
var writeStream = bucket.openUploadStreamWithId(filename, filename);
var s = new stream.Readable();
s.push(data);
s.push(null); // Push null to end stream
s.pipe(writeStream);
writeStream.on('finish', resolve);
writeStream.on('error', reject);
};
return new Promise(function(resolve, reject) {
var bucket = new mongo.GridFSBucket(dbo);
bucket.find({_id: filename}).count(function(err, count) {
if (err) return reject(err);
if (count > 0) {
bucket.delete(filename, function() {
putItemHelper(bucket, resolve, reject);
}, reject)
} else {
putItemHelper(bucket, resolve, reject);
}
}, reject);
});
}
function test() {
var MongoUrl = 'mongodb://localhost:27017';
var dbName = 'test';
MongoClient.connect(MongoUrl, function(err, db) {
if (err) throw err;
var dbo = db.db(DbName);
putFileSystemItem(dbo, 'test', 'this is a test')
.then(function(a) {
console.log('Wrote a gridFS file with metadata:', a);
return getFileSystemItem(dbo, 'test')
})
.then(function(a) {
console.log('Got data back from a gridFS file:', a);
db.close();
})
.catch(function(e) {
console.log(e);
db.close();
})
});
}
test();
Кредит: Он собран из десятка других страниц Stackru и справки MongoDB API.
Хотя это было давно. У меня была эта проблема, и я решил ее, создав поток из строки вместо файла. Как это:
var writestream = gfs.createWriteStream({
filename: fileName
});
// Create stream with buffer to pipe to writestream
var s = new stream.Readable();
s.push(pic);
s.push(null); // Push null to end stream
s.pipe(writestream);
writestream.on('close', function (file) {
// Do anything with the file
cb(null, file.filename);
}).on('error', cb);
Получил идею потока отсюда
Я столкнулся с той же проблемой. Я просто удалил файл, используя gfs.remove, а затем добавил обновленный файл в GridFS.
Также к вашему сведению. Я использовал async.series, чтобы сначала завершить операцию удаления, а затем записать обновленный файл в GridFS.
Надеюсь это поможет!