【问题标题】:Do you need to save a file locally before sending it to a mongo db?在将文件发送到 mongodb 之前,是否需要在本地保存文件?
【发布时间】:2020-07-04 19:28:50
【问题描述】:
【问题讨论】:
标签:
javascript
reactjs
express
multer
【解决方案1】:
我猜 GridFS API 会对你有所帮助。它说:
你可以 .pipe() 直接从文件流到 MongoDB
这是根据文档的示例:
const assert = require('assert');
const fs = require('fs');
const mongodb = require('mongodb');
const uri = 'mongodb://localhost:27017';
const dbName = 'test';
mongodb.MongoClient.connect(uri, function(error, client) {
assert.ifError(error);
const db = client.db(dbName);
var bucket = new mongodb.GridFSBucket(db);
fs.createReadStream('./meistersinger.mp3').
pipe(bucket.openUploadStream('meistersinger.mp3')).
on('error', function(error) {
assert.ifError(error);
}).
on('finish', function() {
console.log('done!');
process.exit(0);
});
});
文档链接:https://mongodb.github.io/node-mongodb-native/3.0/tutorials/gridfs/streaming/
希望有帮助!
【解决方案2】:
是的,您想将文件存储在本地。我使用了 NFS 服务器 (FreeNas) 并将其安装到该本地文件夹。
因此,当我将文件保存到该位置时,它存储在其他 NFS 服务器上。然后我将该图像位置作为响应发送回响应,然后将该位置保存在 Mongodb 中。
示例 uploads.js
router.post('/', auth, async (req, res) => {
let CurrentDate = moment().unix();
if (req.files.file === null) {
return res.status(400).json({ msg: 'no file uploaded' });
}
let user = await User.findById(req.user.id).select('-password');
let file = req.files.file;
file.name = CurrentDate + user._id + '.jpg';
file.mv(`./client/public/uploads/${file.name}`, (err) => {
if (err) {
console.error(err);
return res.status(500).send(err);
}
res.json({ fileName: file.name, filePath: `/uploads/${file.name}`});
});
});
这就是mongodb条目的样子
image:"/uploads/15951066675f1365239d46882312332d20.jpg"