这里有用于上载和存储图像文件的中间件。我已经使用猫鼬库上传到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>
如果只需要特定的文件类型。检查内部文件选项并拒绝错误。
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>