【发布时间】:2020-06-17 08:41:34
【问题描述】:
我有一个包含多个字段的表单,其中一个是用于上传图像的文件字段。
name = 'john doe'
location = 'Some location'
image = (binary)
我的问题是如何在两次(即创建和更新)验证此图像文件。
对于创建,每个字段都是必需的,但对于编辑,用户可能不想更新图像而只更新文本字段,因此他不会选择图像文件
router.post('/user', upload.single('image'), userRoute);
我已经制作了这样的中间件,但这并没有给出正确的验证结果。假设用户选择了一张图片并按下了提交按钮,那么我将在 req.file 中得到类似的内容。
{ fieldname: 'image',
originalname: 'images (2).jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: 'uploads/top-level',
filename: 'images (2)-1583345397445.jpg',
path: 'uploads\\top-level\\images (2)-1583345397445.jpg',
size: 33766 }
这是有道理的,但假设用户选择了一些不是我希望用户提交的文件类型的 zip 文件,因此我必须抓住它并向用户展示文件类型不是图像。让我知道我是否可以使用上述中间件。
router.post('/user', userRoute);
我的 userRoute 函数我写了这样的东西来捕捉错误
upload(req, res, function (err) {
if (err instanceof multer.MulterError) {
// catch error and show to user
} else if (err) {
// catch error and show to user here also
}
// Logic goes here
// and we get the req.body here
})
这对于创建每个字段都是强制性的已经足够了
但是对于编辑,如果用户没有更新图像,我如何将数据保存到数据库,这意味着我只得到两个字段
- 姓名
- 位置
如果用户选择图像,那么我将保存,否则我将跳过图像并仅保存两个字段。我怎样才能做到这一点,如果用户没有选择正确的图像类型,那么我将不得不向用户显示错误。
这里是 multer 代码
var upload = multer({
storage: multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads/top-level')
},
filename: function (req, file, cb) {
cb(null, file.originalname.split('.')[0] + '-' + Date.now() + path.extname(file.originalname))
}
}),
fileFilter: (req, file, cb) => {
if (file.mimetype == "image/png" || file.mimetype == "image/jpg" || file.mimetype == "image/jpeg") {
cb(null, true);
} else {
return cb(null, false);
}
}
});
【问题讨论】: