由于某种原因,multer上的文件过滤器没有被调用。
这是我的控制器(我使用的是快速路由器)
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函数必须在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
});
问题内容: 我将其作为Express服务器的配置 但是当我在路线中询问时,仍然会指出一些错误。这是使用的路线示例: 我读到这个问题是由于缺少该问题引起的,但是如您所见,我在路由之前将其称为。 有什么线索吗? 问题答案: 正如已经在一个评论下发布的那样,我使用 代替 我仍然不知道为什么简单的方法不起作用…
问题内容: 突然,这已经发生在我所有的项目中。 每当我使用express和body-parser在nodejs中发帖时,它都是一个空对象。 通过ajax和邮递员,它总是空的。 但是通过卷曲 它按预期工作。 我尝试在前者中手动设置,但随后我总是得到 这让我发疯。 我以为是人体分析器中有一些更新,但是我降级了,但没有帮助。 任何帮助表示赞赏,谢谢。 问题答案: 在可用于内容类型的3个选项的邮递员中,选
问题内容: 这是我的问题,我有一个表单,可以在其中插入文件和字段,但仅接收文件而不接收参数!为什么? 这是我的代码: app.js: index.html: 有人可以帮我吗? 问题答案: 2017更新 从自述文件 请注意,req.body可能尚未完全填充。这取决于客户端将字段和文件传输到服务器的顺序。 我通过反转前端的表单对象属性的顺序解决了我的问题: 在后端:
错误: 我试图通过这个留档https://www.npmjs.com/package/multer来处理MulterError,但遇到了一个问题。 控制台.log(req.body)给出 { },而表单 enctype 等于“多部分/表单数据”。如果我将其更改为“应用程序/ x-www-表单-网址编码”,则req.body是正常的,但文件不会上传到服务器。 穆特用法 从保修页面使用表单enctyp
问题内容: 我有以下表格,提交后结果为空这是我的HTML: 这是我的(一部分): 该工作正常。我得到一个空对象。 问题答案: 您以HTML POST的身份提交,这意味着您正在使用。 这意味着您需要添加,这样express可以解析该请求并将其放入
问题内容: 我正在我的应用程序上执行以下操作,但是我无法获取routeChangeSuccess事件。 如下所示的非常简单的html也会失败 但是,当我单击链接时,我看到视图正在更新,但是从未触发$ routeChangeSucces事件。 有什么我想念的吗? *我遇到的 *另一个问题 是,可以挂接一个事件以知道视图已准备好,这样我就可以开始一些其他处理,例如document.ready()。 p