我正在尝试在我的网络应用程序中启用个人资料图片功能。为此,我使用 Express (4.19.2) 作为服务器,使用 Multer (1.4.5-lts.1) 进行多部分请求和文件处理,但是,Multer 目标代码似乎被忽略。我遵循了一些示例并获得了以下 Multer 中间件代码:
// Required modules
const fs = require('fs');
const path = require('path');
const multer = require('multer');
const validPictureExtensions = ['jpg', 'jpeg', 'png'];
// Profile picture configuration
const pictureStorage = multer.diskStorage({
destination: (req, file, cb) => {
// First check if resources directory exists
if (!fs.existsSync(path.join(__dirname, '..', '..', 'resources'))) {
console.info('Resources directory created.');
fs.mkdirSync(path.join(__dirname, '..', '..', 'resources'));
}
// Then check if users directory exists
if (!fs.existsSync(path.join(__dirname, '..', '..', 'resources', 'users'))) {
console.info('Users directory created.');
fs.mkdirSync(path.join(__dirname, '..', '..', 'resources', 'users'));
}
cb(null, 'users');
},
filename: (req, file, cb) => {
const ext = file.originalname.split('.').pop();
const name = `${req.user.id}.${ext}`;
cb(null, name);
}
});
const pictureFileFilter = (req, file, cb) => {
const ext = file.originalname.split('.').pop();
const isValid = validPictureExtensions.includes(ext);
cb(null, isValid);
};
module.exports = {
pictureMdw: multer({ pictureStorage, pictureFileFilter }),
}
然后,我在 /users 路径中使用之前的中间件,如下所示:
// Router
const router = require('express').Router();
// Middleware
const { pictureMdw } = require('./../middlewares/fileUpload');
// PUT
router.put('/:tagOrID/picture', pictureMdw.single('file'), userCont.updateUserPicture);
module.exports = router;
Multer中间件执行后相关控制器代码如下
await sharp(req.file.buffer)
.resize({ width: 500, height: 500 })
.jpeg()
.toFile(path.join(__dirname, '..', '..', 'resources', 'users', `${tag}.jpeg`));
res.sendStatus(200);
仅当之前使用类似
mkdir -p resources/users
之类的内容创建了必要的目录时,一切才能正常工作,否则,我会收到错误。我还没有运行调试器,但在中间件配置中调用时甚至没有打印 console.log('Here')
。
这里可能发生什么?我应该检查控制器中是否存在目录吗?我应该选择完全不同的方法吗?
问题在于传递给导出的 Multer 实例的错误配置。
module.exports = {
pictureMdw: multer({ storage: pictureStorage, fileFilter: pictureFileFilter }),
}
感谢Prerak Sola指出了这一点。