node.js - 使用 mongoose 在 mongo db 中存储图像
问题描述
我不想将文件直接存储到 mongodb 中,而是使用 mongoose 库进行存储。如何使用代码框架相同的猫鼬库?
更新::保存在猫鼬库中。现在它上传了所有文件,但我怎样才能只存储 docx 文件而不是图像文件。并且上传任何其他文件应该说无效文件。
更新 2:: 解决了这个问题。现在只能允许 docxx 文件。现在需要添加注释部分中提到的带有扩展名的文件名。如何使用那部分代码。
中间件::upload.js
const util = require("util");
const multer = require("multer");
const GridFsStorage = require("multer-gridfs-storage");
const mongoose = require('mongoose');
const Grid = require('gridfs-stream');
const mongoURI ='mongodb://localhost:27017/file_uploaded';
const promise = mongoose.connect(mongoURI, { useNewUrlParser: true });
const conn = mongoose.connection;
let gfs;
conn.once('open',() => {
gfs = Grid(conn, mongoose.mongo);
gfs.collection('uploads');
});
var storage = new GridFsStorage({
db: promise,
options: { useNewUrlParser: true, useUnifiedTopology: true },
file: (req, file) => {
return new Promise((resolve, reject) => {
if (file.mimetype === 'application/vnd.openxmlformats-
officedocument.wordprocessingml.document') {
resolve({
bucketName: 'words'
})
***//Add filename inorder to maintain original final name with
extention***
//const filename = `${Date.now()}-
bezkoder-${file.originalname}`;
//return filename;
} else {
reject(Error("File type has been rejected"));
}
});
}
});
var uploadFile = multer({ storage: storage }).single("file");
var uploadFilesMiddleware = util.promisify(uploadFile);
module.exports = uploadFilesMiddleware;
解决方案
您不需要使用 GridFsStorage。试试下面的代码。
// file-controller.js
const express = require('express');
const mongoose = require('mongoose');
const multer = require('multer');
const router = express.Router();
const multerStorage = multer.memoryStorage();
const upload = multer({ storage: multerStorage, });
const imageSchema = mongoose.Schema({
image: { data: Buffer, contentType: String },
}, { timestamps: true });
const ImageModel = mongoose.model('images', imageSchema);
router.post('/upload', upload.single('image'), async (req, res, next) => {
const image = { data: new Buffer.from(req.file.buffer, 'base64'), contentType: req.file.mimetype }
const savedImage = await ImageModel.create(image);
res.send(savedImage);
});
router.get('/getImage/:id', async (req, res, next) => {
const { id: _id } = req.params;
// If you dont use lean(), you wont decode image as base64
const image = await ImageModel.findOne({ _id }).lean().exec();
res.send(image);
});
module.exports = router;
通过快递服务路线。
const express = require('express');
const FileController = require('./file-controller');
const app = express();
// Mongo DB connection code ...
// Serve static files code ...
app.use('/file', FileController);
app.listen(3000, () => console.log(`Example app listening on port ${port}!`));
推荐阅读
- javascript - “Runtime.ImportModuleError”尝试使用层访问 AWS lambda 函数中的 npm 包
- artificial-intelligence - 只产生一个孩子的交叉算子
- java - 创建名称为“centralPagamentoPfController”的 bean 时出错:通过字段“服务”表示的依赖关系不满足;
- sql-server - SSRS 导出到 word - 错误:矩形太复杂,无法导出到 Word
- php - 使用另一个带有键的数组作为正在查找的值以及替换它的值来更新多维数组值的最佳方法
- amazon-web-services - 我需要能够在本地远程运行软件,并且能够根据我是否有互联网连接来访问它
- vb.net - 从从输入文件读取的文件名创建超链接以写入输出文本文件
- c# - 如何预热托管在 IIS 中的 asp.net 核心应用程序(a)在网站重新启动和(b)重新部署时?
- ansible - ansible 返回错误!意外的参数类型在起作用:
- android - 您可以将 Recyclerview 位置保存到变量中吗?