Node.js 使用mongoose在MongoDB中存储图像
我希望使用mongoose库来存储文件,而不是直接将文件存储到mongodb中。如何使用相同的代码框架使用mongoose库 更新::保存在mongoose库中。现在它上载了所有的文件,但是我怎么能只存储docx文件而不是图像文件呢。上传任何其他文件都应该说是无效文件 更新2::已解决此问题。现在只允许docxx文件。现在需要添加文件名和扩展名,如注释部分所述。如何使用这部分代码 中间件::upload.jsNode.js 使用mongoose在MongoDB中存储图像,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我希望使用mongoose库来存储文件,而不是直接将文件存储到mongodb中。如何使用相同的代码框架使用mongoose库 更新::保存在mongoose库中。现在它上载了所有的文件,但是我怎么能只存储docx文件而不是图像文件呢。上传任何其他文件都应该说是无效文件 更新2::已解决此问题。现在只允许docxx文件。现在需要添加文件名和扩展名,如注释部分所述。如何使用这部分代码 中间件::upload.js const util = require("util"); const multer
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}!`));
请回答您的问题,以澄清您的具体问题,或添加其他详细信息,以突出显示您所需的内容。你们有并没有尝试过使用?把你们的mimetype改成docx。const match=['application/vnd.openxmlformats officedocument.wordprocessingml.document']我编辑了代码,但仍在上载所有文件类型。我只想要特定的.docx文件,文件的其余部分应该说是无效的文件类型。更新了我的代码,只接受所需的文件类型。现在需要添加文件名以获得自定义文件类型。我已经在注释中编写了代码,但它不起作用。我如何实现它?就像前面的问题一样,我如何导出才能在我的route.jsUpdated代码中使用。您可以添加mongodb连接并提供HTML文件。不要忘记通过多部分数据发送post文件。路由器。post('/upload',upload.single('image'),异步(req,res,next)=>{const image={data:new Buffer.from(req.file.Buffer,'base64'),contentType:req.file.mimetype}const savedImage=wait ImageModel.create(image);res.send(savedImage);});你能解释一下这句话吗。我还编辑了我的中间件。你能看看它是否也不错吗?