node.js - Multer fileFilter 未被调用且 req.body 为空
问题描述
由于某种原因,multer 上的 fileFilter 没有被调用。
这是我的控制器(我正在使用快速路由器)
const express = require('express');
const router = express.Router();
const UploadController = require('../controllers/UploadController');
router.route('/upload').post(UploadController.upload);
module.exports = router;
这是控制器
const multer = require('multer');
const fs = require('fs');
module.exports = {
upload: function (req, res) {
let storage = multer.diskStorage({
destination: function (req, file, cb) {
console.log('here');
const filesDir = './uploads/' + req.body.ref;
if (!fs.existsSync(filesDir)) {
fs.mkdirSync(filesDir);
}
cb(null, filesDir);
},
filename: function (req, file, cb) {
let extArray = file.mimetype.split("/");
let extension = extArray[extArray.length - 1];
cb(null, req.body.type + '-' + Date.now() + '.' + extension);
},
fileFilter : function (req, file, cb) {
if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
return cb(new Error('Only image files are allowed!'), false);
}
cb(null, true);
}
})
const upload = multer({ storage: storage }).single('file');
upload(req, res, function (err) {
if (err instanceof multer.MulterError) {
res.send({
error: err
});
} else if (err) {
res.send({
error: err
});
}else{
res.send({
file: req.file,
body: req.body
});
}
});
}
}
我有以下问题:
- 甚至没有调用 fileFilter 函数,因此它不验证文件
- 上传功能上的 req.body (upload: function (req, res)) 是空的,它仅在 diskStorage 和最后上传功能 (upload(req, res, function (err)) 中可用,所以我也无法验证正文数据.
解决方案
我有同样的问题。fileFilter 函数必须在内部定义multer
,而不是在diskStorage
函数内部。
为了使其更具可读性,我在变量中定义了存储和过滤器,而不是在multer
调用中创建所有内容。
// storage settings
const multerStorage = multer.diskStorage({
destination: function(req, file, next) {
next(null, './public/files');
},
filename: function(req, file, next) {
const sanitizedName = file.originalname
.replace('/[^a-z0-9\./gi', '-')
.replace('/-{2,}/g', '-')
.toLowerCase();
const name = Date.now() + '-' + sanitizedName;
// sending the file name to be stored in the database
req.body.filename = name;
next(null, name);
},
limits: {
fileSize: 25000000
}
});
// filter function
const multerFilter = function(req, file, cb) {
const ext = path.extname(file.originalname).toLowerCase();
if (ext !== '.pdf') {
cb(new Error('File must be in PDF format.'));
}
cb(null, true);
}
然后将存储设置和过滤功能应用于multer
:
const upload = multer({
storage: multerStorage,
fileFilter: multerFilter
});
推荐阅读
- r - 如何找到一个值在 R 数据集中的不同列中出现的实例数?
- delphi - 如何在 fmx delphi 中为 utf8 语言(如波斯语)模拟键盘事件?
- javascript - 通过 html datalist 和 *ngFor 显示一个值并提交另一个值
- google-apps-script - 如何将 onEdit 限制为特定单元格中的更改?
- android - 如何使用 FilePcker.Builder 的相机选项隐藏我正在拍摄的画廊中的图像?
- kubernetes - glusterfs heketi 使用分区而不是原始设备以允许轻松扩展
- php - 发送多封电子邮件时出错,应该只发送一封
- rest - 如果休息端点正在使用外部休息端点,Swagger/其他 API 文档/工具能否提供信息
- c# - HTTP 错误 403.14 - 禁止,本地主机:12401
- python - Python exec() 无法在函数中初始化类实例