Web 开发中,图片是一个必不可少的组成部分。传统的文件系统存储图片存在着各种问题,例如性能、维护和扩展的问题。随着 NoSQL 数据库的发展和流行,将图片存储在 MongoDB 中已成为一种高效并且可扩展的方式。
使用 MongoDB 作为图片存储解决方案的好处:
- 空间效率高:MongoDB 使用 GridFS 储存大型二进制对象,可以存储的文件大小不受限制。
- 高可靠性:MongoDB 默认提供的副本集和分片功能可以保证数据的可靠性和高可用性。
- 简单的部署和维护:使用单个 MongoDB 实例或者分布式 MongoDB 实例均可轻松部署和维护。
- 方便扩展:MongoDB 的分布式架构可以轻松扩展存储容量和性能,随着业务的扩展能够无缝地连接集群。
- 方便的备份和恢复:MongoDB 提供了现成的备份和恢复工具,可以保证数据的安全和完整。
下面是使用 Node.js 操作 MongoDB 存储图片的实践。
环境搭建
安装 MongoDB 和 Node.js。
使用 NPM 安装依赖项:
npm install mongodb multer express
创建一个 MongoDB 数据库。
创建一个专门存储图片的 GridFS 集合:
// www.javascriptcn.com code example const mongo = require('mongodb'); const MongoClient = mongo.MongoClient; const url = 'mongodb://localhost:27017/YourDatabaseNameHere'; MongoClient.connect(url, function(err, db) { if (err) throw err; const dbo = db.db("YourDatabaseNameHere"); dbo.createCollection('photos.files', function (err, res) { if (err) throw err; console.log("photos.files 集合已创建"); db.close(); }); dbo.createCollection('photos.chunks', function (err, res) { if (err) throw err; console.log("photos.chunks 集合已创建"); db.close(); }); });
编写上传和下载图片的 API
// www.javascriptcn.com code example
const express = require('express');
const app = express();
const mongo = require('mongodb');
const MongoClient = mongo.MongoClient;
const url = 'mongodb://localhost:27017/YourDatabaseNameHere';
const multer = require('multer');
// 设置文件存储路径、文件名
const storage = multer.diskStorage({
destination(req, file, cb) {
cb(null, '/path/to/images');
},
filename(req, file, cb) {
cb(null, `${file.fieldname}-${Date.now()}`);
}
});
const upload = multer({ storage });
// 上传图片 API
app.post('/upload', upload.single('photo'), (req, res) => {
MongoClient.connect(url, (err, db) => {
if (err) throw err;
const dbo = db.db("YourDatabaseNameHere");
const bucket = new mongo.GridFSBucket(dbo);
const rs = fs.createReadStream(req.file.path);
const uploadStream = bucket.openUploadStream(req.file.originalname);
rs.pipe(uploadStream)
.on('error', (err) => {
console.log('Error uploading image');
res.sendStatus(500);
})
.on('finish', () => {
console.log('Image uploaded successfully');
fs.unlink(req.file.path, (err) => {
if (err) throw err;
});
res.sendStatus(200);
});
});
});
// 下载图片 API
app.get('/:filename', (req, res) => {
MongoClient.connect(url, (err, db) => {
if (err) throw err;
const dbo = db.db("YourDatabaseNameHere");
const bucket = new mongo.GridFSBucket(dbo);
const downloadStream = bucket.openDownloadStreamByName(req.params.filename);
downloadStream.on('error', (err) => {
console.log('Failed to download image');
res.sendStatus(404);
});
downloadStream.pipe(res)
.on('error', (err) => {
console.log('Error sending image to client');
res.sendStatus(500);
})
.on('finish', () => {
console.log('Image sent to client');
res.end();
});
});
});
const server = app.listen(3000, () => {
console.log(`Listening on port ${server.address().port}`);
});使用示例
启动服务:
node app.js
上传一张图片:
请求方式:POST URL:http://localhost:3000/upload
请求体:包含一个名为 photo 的文件字段
返回:200 表示上传成功,500 表示上传失败
下载一张图片:
请求方式:GET URL:http://localhost:3000/photo.png
返回:将图片作为响应发送到客户端,404 表示图片不存在,500 表示发送失败
小结
本文介绍了使用 MongoDB 存储图片的优点和实践方法。通过 Node.js 编写上传和下载 API,可以快速地实现 MongoDB 存储图片并且方便的进行扩展和维护。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d05292e46428fe9ed3cbcb