上传文件时 Multer 出现意外的字段错误

Posted

技术标签:

【中文标题】上传文件时 Multer 出现意外的字段错误【英文标题】:Unexpected field error from Multer while file uploading 【发布时间】:2021-08-15 01:23:09 【问题描述】:

您好,我想创建一个带有 react 和 express 的文件上传 API。所以,我用了集合。但是当我从客户端发送到轴请求时,我从服务器收到错误。

错误:

MulterError:意外字段

我的 Express 服务器代码是这样剪断的:

const storage = multer.diskStorage(
    destination : '/',
    filename(req,file,cb)
        const newFileName = `$uuid()-$file.originalname`
        cb(null,newFileName);
    
)

const uploadVideoFile = multer(
    storage : storage
).single("videofile");

app.post('/upload', uploadVideoFile, (req,res)=>
    if(req.file)
        const filename = req.file.filename;
        const title , description = req.body;

        open(oAuth.generateAuthUrl(
            access_type : 'offline',
            scope : 'https://googleapis.com/auth/youtube.upload',
            state : JSON.stringify(
                filename, title, description
            )
        ))
    
)

我的反应客户是这样的:

    const[form,setForm] = React.useState(
        title : "",
        description : "",
        file : null
    )

    function handleChange(event)
        const inputValue = event.target.name === "file" ? event.target.files[0] : event.target.value;

        setForm(
            ...form,
            [event.target.name] : inputValue
        )
    

    function handleSubmit(event)
        event.preventDefault();
        
        const videoData = new FormData();
        videoData.append("videoFile", form.file);
        videoData.append("title", form.title);
        videoData.append("description", form.description);

        axios.post('http://localhost:3000/upload', videoData).then(response=>
            console.log(response.data)
        )
    

    return (
    <div>
        <h1>Youtube Upload Service</h1>
        <form onSubmit=handleSubmit>
            <div>
                <input onChange=handleChange type="text" name="title" autoComplete="off" placeholder="Title"/>
            </div>
            <div>
                <textarea onChange=handleChange type="text" name="description" autoComplete="off" placeholder="Description"/>
            </div>
            <div>
                <input onChange=handleChange accept="video/mp4" type="file" name="file" placeholder="Video File"/>
            </div>
            <button type="submit">Upload Video</button>
        </form>
    </div>
        )

为什么我会收到此错误?我该如何解决这个问题?

【问题讨论】:

这可能是由于大小写不匹配 - videofile 的 f 在客户端是大写,而在服务器上是小写。 【参考方案1】:

当 Multer 看到一个文件时,它会检查文件输入的名称是否与您配置的完全匹配匹配。它也区分大小写。

您已将 Multer 配置为接受名为“videofile”的单个文件输入:.single("videofile")。然而,在前端,您将其命名为“videoFile”(大写 F):videoData.append("videoFile", form.file);。由于 "videofile" !== "videoFile",Multer 引发了意外的字段错误。

重命名两者中的任何一个以匹配另一个应该可以解决您的问题。要了解 Multer 的工作原理以及将来如何避免此错误,我建议阅读这篇文章:Fix "Unexpected field" Error From Multer

【讨论】:

以上是关于上传文件时 Multer 出现意外的字段错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Multer 将 csv 文件上传到 Node.js 时出现意外字段

当我尝试在 MongoDB 数据库中上传图像时,出现 multer 错误

使用 Multer 上传文件,而不知道它们的字段名

如何使用 bootstrap-vue 上传多个文件

使用带有 expressjs 的 multer 上传文件时的错误处理

使用 multer 上传多个文件,但来自不同的字段?