我有一个使用 multer 上传文件的功能:
exports.create = (req, res) => {
console.log("req.body1 : ")
console.log(req.body)
var fileFilter = function (req, file, cb) {
console.log("req.body2: ")
console.log(req.body)
// supported image file mimetypes
var allowedMimes = ['image/jpeg', 'image/pjpeg', 'image/png', 'image/gif'];
if (_.includes(allowedMimes, file.mimetype)) {
// allow supported image files
cb(null, true);
} else {
// throw error for invalid files
cb(new Error('Invalid file type. Only jpg, png and gif image files are allowed.'));
}
};
let upload = multer({
storage: multer.diskStorage({
destination: (req, file, callback) => {
console.log("req.body3 : ")
console.log(req.body)
let userId = req.params.userId;
let pathToSave = `./public/uploads/${userId}/store`;
fs.mkdirsSync(pathToSave);
callback(null, pathToSave);
},
filename: (req, file, callback) => {
callback(null, uuidv1() + path.extname(file.originalname));
}
}),
limits: {
files: 5, // allow only 1 file per request
fileSize: 5 * 1024 * 1024, // 5 MB (max file size)
},
fileFilter: fileFilter
}).array('photo');
upload(req, res, function (err) {
console.log("req.body4 : ")
console.log(req.body)
...
...
正如你所看到的,有很多console.log通过POST方法打印出传入数据的信息。奇怪的是,直到进入最后上传功能,文件以外的字段才会出现。
所以问题是我无法使用这些字段验证内容,直到它到达最后一个上传函数。所以如果文件以外的其他字段存在错误,我无法取消和删除上传的文件。
以下是上述代码的输出:
req.body :
{}
req.body2:
{}
req.body3 :
{}
req.body4 :
{ name: '1111111111',
price: '1212',
cid: '1',
...
文件上传是围绕console.log("req.body3 : ")完成的。然后它在 console.log("req.body4 : ") 中输出其他字段。 我需要在 req.body4 中出现的其他字段来在实际上传文件之前验证内容。但我不能,因为这些字段是在文件上传后检索的。
如何在 multer 真正上传文件之前获取其他人的字段?
====================================================
附:
我发现如果我使用 .any() 而不是 .array('photo') 那么我可以访问字段和文件。但问题仍然是,它首先上传这些文件,然后让我可以访问底部的上传函数中的那些字段,其中 console.log("req.body4 : ") 所在的位置。 所以问题仍然是在我需要使用这些字段进行验证之前先上传文件。
您应该仅在
body
中接收一个对象一个对象,因此您应该能够像任何其他对象一样访问它
{
object1: 'something here',
object2: {
nestedObj1: {
something: 123,
arrInObj: ['hello', 123, 'cool'],
}
}
然后你就可以像这样访问这些东西:
console.log(req.body.object1) // 'something here'
console.log(req.body.object2.nestedObj1[0]) // 'hello'
console.log(req.body.object2.nestedObj1.forEach(item => console.log(item)) // 'hello' 123 'cool'
老问题,但我刚刚不得不处理同样的问题。
就我而言,我从 HTML 表单向服务器发送数据。我最初有
<input type="file" name="image" />
元素 before <input type="text" name="folder" />
元素,其中包含应保存上传文件的文件夹的名称。
upload.fields()
函数 来处理文件和文本值。 (这会将文件添加到 req.files
并将文本值添加到 req.body
)。
Multer 乖乖地处理了上传的图片,将其添加到了
req.files
之前,它把 folder
的值添加到了 req.body
中。结果,Multer 调用了我的 destination()
函数,而 req.body.folder
仍然是 undefined
。
我通过更改 HTML 页面中
<input />
字段的顺序修复了此问题。
但我也明白,我不能指望互联网以正确的顺序传递 POST 消息流的单独块,因此我无法确定在调用
req.body.folder
之前是否已处理 destination()
。
我采用了防御性解决方案,将传入文件保存到
temp
文件夹 if req.body.folder
是 undefined
,然后将文件从 temp
文件夹移动到 next
函数中的正确文件夹,在 Multer 完成所有事情之后。