Nodejs 应用gridfs-stream模块上传图片到mongodb数据库
Nodejs 应用gridfs-stream模块上传图片到mongodb数据库
var mongoose = require(‘mongoose’); var Grid = require(‘gridfs-stream’); var async = require(‘async’); var gfs = Grid(mongoose.connection.db, mongoose.mongo); var GridFile = require(’…/…/models/gridfs’).GridFile;
var put_save = function(req, res) { var fnames = util.isArray(req.files.fname) ? req.files.fname : [req.files.fname]; async.map(fnames, process_file, function(err, results) { res.json({ ‘err’: err, ‘results’: results }) })
function process_file(fname, callback) {
var gfs_options = {
filename: fname.name,
mode: 'w',
content_type: fname.type,
metadata: {
'client': req.user.client.id,
'user': req.user.id
}
};
var writestream = gfs.createWriteStream(gfs_options);
fs.createReadStream(fname.path).pipe(writestream);
writestream.on('close', function(file) {
fs.unlink(fname.path, function(err) {
if (err) {
return callback(err, null);
};
callback(null, file)
});
});
}
}
Node.js 应用 gridfs-stream
模块上传图片到 MongoDB 数据库
在本教程中,我们将介绍如何使用 Node.js 和 gridfs-stream
模块将图片文件上传到 MongoDB 数据库。这将包括安装必要的依赖项、配置连接以及实现文件上传逻辑。
安装依赖项
首先,确保你已经安装了以下依赖项:
npm install mongoose gridfs-stream multer
- Mongoose:用于连接和操作 MongoDB。
- gridfs-stream:用于通过流式接口与 MongoDB 的 GridFS 进行交互。
- Multer:一个 Node.js 中间件,用于处理
multipart/form-data
,主要用于上传文件。
配置连接
接下来,配置 Mongoose 连接到 MongoDB,并初始化 gridfs-stream
:
const mongoose = require('mongoose');
const Grid = require('gridfs-stream');
const GridFile = require('./models/gridfs').GridFile; // 假设你有一个 GridFile 模型
// 连接 MongoDB
mongoose.connect('mongodb://localhost/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });
// 初始化 gridfs-stream
let gfs;
mongoose.connection.once('open', () => {
gfs = Grid(mongoose.connection.db, mongoose.mongo);
});
实现文件上传逻辑
现在我们来实现文件上传逻辑。我们将使用 Multer 来处理文件上传请求:
const express = require('express');
const multer = require('multer');
const fs = require('fs');
const async = require('async');
const app = express();
const upload = multer({ dest: 'uploads/' });
app.post('/upload', upload.array('files'), (req, res) => {
let fnames = Array.isArray(req.files) ? req.files : [req.files];
async.map(fnames, processFile, (err, results) => {
res.json({
err: err,
results: results
});
});
});
function processFile(file, callback) {
const gfsOptions = {
filename: file.originalname,
mode: 'w',
content_type: file.mimetype,
metadata: {
client: req.user.client.id,
user: req.user.id
}
};
const writeStream = gfs.createWriteStream(gfsOptions);
fs.createReadStream(file.path).pipe(writeStream);
writeStream.on('close', (file) => {
fs.unlink(file.path, (err) => {
if (err) {
return callback(err, null);
}
callback(null, file);
});
});
}
app.listen(3000, () => console.log('Server running on port 3000'));
解释
-
配置连接:
- 使用 Mongoose 连接到 MongoDB。
- 初始化
gridfs-stream
以便我们可以使用它来读写文件。
-
文件上传逻辑:
- 使用 Multer 处理文件上传。
- 将上传的文件保存到临时目录(例如
uploads/
)。 - 使用
async.map
并行处理每个上传的文件。 - 创建一个
writeStream
并将上传的文件流写入 MongoDB。 - 在文件写入完成后删除临时文件。
通过上述步骤,你可以使用 Node.js 和 gridfs-stream
模块将图片文件上传到 MongoDB 数据库。
这个包的作用式直接把文件以流的方式上传到mongo吗?
如果我要直接上传下载一个buffer数据呢,怎么操作????
为了将图片上传到MongoDB数据库中,我们可以使用gridfs-stream
模块。下面是一个简单的示例代码,展示了如何实现这一功能。
示例代码
首先,确保安装了所需的依赖包:
npm install mongoose gridfs-stream multer
接下来是代码部分:
const mongoose = require('mongoose');
const Grid = require('gridfs-stream');
const multer = require('multer');
const fs = require('fs');
// 连接到MongoDB
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });
// 初始化gfs
let gfs;
mongoose.connection.once('open', () => {
gfs = Grid(mongoose.connection.db, mongoose.mongo);
});
// 设置Multer以处理文件上传
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/')
},
filename: function (req, file, cb) {
cb(null, file.originalname);
}
});
const upload = multer({ storage: storage });
// 处理上传的文件
app.post('/upload', upload.single('file'), (req, res) => {
const file = req.file;
const writeStream = gfs.createWriteStream({
filename: file.originalname,
mode: 'w',
content_type: file.mimetype,
metadata: {
client: req.user.client.id,
user: req.user.id
}
});
fs.createReadStream(file.path).pipe(writeStream);
writeStream.on('close', (file) => {
fs.unlink(file.path, (err) => {
if (err) {
return res.status(500).send(err);
}
res.status(200).json({ message: 'File uploaded successfully' });
});
});
});
解释
- 连接到MongoDB:使用
mongoose
连接到MongoDB数据库。 - 初始化gfs:当Mongoose连接打开后,初始化
gridfs-stream
。 - 设置Multer:使用Multer来处理文件上传,设置存储策略。
- 处理上传的文件:
- 使用Multer的
upload.single('file')
中间件处理单个文件上传。 - 创建一个
writeStream
用于将文件写入GridFS。 - 使用
fs.createReadStream
读取临时文件并将其写入GridFS。 - 在文件写入完成后删除临时文件,并返回成功消息。
- 使用Multer的
这样,你就可以通过这个API接口上传图片到MongoDB的GridFS中了。