使用猫鼬库存储在mongoDB中

问题描述 投票:0回答:1

这里有用于上载和存储图像文件的中间件。我已经使用猫鼬库上传到mongoDB中。在这里,我只允许docx文件上传,而其他文件类型显示为“无效文件类型”。如何分配mimetype使其仅接受docx文件?

middleware.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) => {
        const match = ["image/png", "image/jpeg"];

        if (match.indexOf(file.mimetype)===-1) {
            const filename = `${Date.now()}-bezkoder-${file.originalname}`;
            return filename;
        } 
        return {
            bucketName: "photos",
            filename: `${Date.now()}-bezkoder-${file.originamname}`
        };
    }
});

var uploadFile = multer({storage: storage}).single("file");
var uploadFilesMiddleware = util.promisify(uploadFile);
module.exports = uploadFilesMiddleware;

upload.js

这是用于上传图像的控制器。

const upload = require("../middleware/middleware");

const uploadFile = async(req,res) => {
    try {
        await upload(req,res);

        console.log(req.file);
        if (req.file == undefined) {
            return res.send('You must select a file');
        }
        return res.send('File has been uploaded.');
    } catch(error) {
        console.log(error);
        return res.send(`Error when trying upload image: ${error}`);
    }
};

module.exports = {
    uploadFile: uploadFile
};

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Node.js upload images</title>
  </head>

  <body>
          <h4>Node.js upload images - bezkoder.com</h4>

          <form class="mt-4"
            action="/upload"
            method="POST"
            enctype="multipart/form-data"
          >
            <div class="form-group">
              <input
                type="file"
                name="file"
                id="input-files"
                class="form-control-file border"
              />
            </div>
            <button type="submit" class="btn btn-primary">Submit</button>
          </form>
      <hr />
  </body>
</html>
node.js mongodb express mongoose
1个回答
0
投票

如果只需要特定的文件类型。检查内部文件选项并拒绝错误。

const express = require('express');
const multer = require('multer');
const GridFsStorage = require('multer-gridfs-storage');
const url = 'mongodb://localhost:27017/files';

const storage = new GridFsStorage({
    url: url,
    options: {useUnifiedTopology: true},
    file: (req, file) => {
        return new Promise((resolve, reject) => {
            if (file.mimetype === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {
                resolve({
                    bucketName: 'words'
                })
            } else {
                reject(Error("File type has been rejected"));
            }
        });
    }
});

const upload = multer({ storage });

const app = express();

app.get('/',  (req, res, next) => {
        res.sendFile(__dirname+"/index.html")
});

app.post('/file', upload.single('file'), (req, res, next) => {
        res.send(req.file)
});

app.listen(3333);

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form enctype="multipart/form-data" action="/file" method="post">
        <div>
            <label>Select a file:</label>
            <input type="file" name="file" />
        </div>
        <div>
            <button type="submit">Submit</button>
        </div>
    </form>
</body>

© www.soinside.com 2019 - 2024. All rights reserved.