multer上传文件前获取文件以外其他字段的req.body

问题描述 投票:0回答:2

我有一个使用 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 : ") 所在的位置。 所以问题仍然是在我需要使用这些字段进行验证之前先上传文件。

node.js multer
2个回答
1
投票

您应该仅在

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'

0
投票

老问题,但我刚刚不得不处理同样的问题。

就我而言,我从 HTML 表单向服务器发送数据。我最初有

<input type="file" name="image" />
元素 before
<input type="text" name="folder" />
元素,其中包含应保存上传文件的文件夹的名称。

我使用 Multer 的

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 完成所有事情之后。

© www.soinside.com 2019 - 2024. All rights reserved.