首页 > 解决方案 > 使用 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;

标签: node.jsmongodbexpressmongoose

解决方案


您不需要使用 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}!`));

推荐阅读