使用 Multer 时出现意外的表单错误结束

Upd*_*dog 26 javascript node.js express multer

我正在尝试将图像(jpg/jpeg/png)从浏览器上传到 NodeJS。我已经阅读了一些教程和论坛上的许多帖子,但似乎很少有这个具体问题。

  • 我已确保将提供给 multer ( upload.single('upload')) 的名称与 formData 键 ( formData.append('upload', selectedFile, selectedFile.name))相匹配
  • 我最初尝试使用标头,但后来读到我应该排除它们。
  • 我尝试通过 a 提交<form action="/upload" method="post" enctype="multipart/form-data">,但仍然遇到相同的错误。

我发现这个类似的问题只有一个答案不清楚, Multer给出了意外的表单错误结束,而这个问题Unexpected end of form at Multipart._final没有答案。其他所有问题似乎都与“意外字段”或“多部分数据意外结束”错误有关,从解决方案来看,这些错误与此处无关。

下面是我的代码...

浏览器:

<body>
  <input type="file" id="file_uploader" name="upload" />
  <button onclick="uploadImage()" class="btn-default">SUBMIT</button>
  
  <!-- OTHER STUFF -->

</body>
<script>
  let selectedFile;
  let uploadData = new FormData();
    
  const fileInput = document.getElementById('file_uploader');
  fileInput.onchange = () => {
    selectedFile = fileInput.files[0];
    uploadData.append('upload', selectedFile, selectedFile.name);
  }

  function uploadImage(){
    fetch('/upload', {
      method: 'POST',
      body: uploadData
    }) 
    .then((response) => {
      console.log(response);
    })
    .catch((error) => {
      console.error('Error: ', error);
    });
  }
</script>
Run Code Online (Sandbox Code Playgroud)

NodeJS

let express = require('express');
const multer = require('multer');

//multer options
const upload = multer({
  dest: './upload/',
  limits: {
    fileSize: 1000000,
  }
})

const app = express();

app.post('/upload', upload.single('upload'), (req, res) => {
  res.send();
}, (error, req, res, next) => {
  console.log(error.message);
})

exports.app = functions.https.onRequest(app);
Run Code Online (Sandbox Code Playgroud)

...这是错误日志,如果有帮助的话:

Error: Unexpected end of form
>      at Multipart._final (C:\Users\p\Downloads\MyInvestmentHub\functions\node_modules\busboy\lib\types\multipart.js:588:17)
>      at callFinal (node:internal/streams/writable:694:27)
>      at prefinish (node:internal/streams/writable:723:7)
>      at finishMaybe (node:internal/streams/writable:733:5)
>      at Multipart.Writable.end (node:internal/streams/writable:631:5)
>      at onend (node:internal/streams/readable:693:10)
>      at processTicksAndRejections (node:internal/process/task_queues:78:11)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我还没有发布很多问题,因此,如果我遗漏了某些内容或格式错误,我深表歉意。请告诉我,我将进行适当的编辑。

谢谢。

小智 15

我也得到了完全相同的错误。

在使用 multer 之前我已经安装了express-fileupload. 当我使用命令卸载它时,npm uninstall express-fileupload我可以消除该错误。

如果情况与您相同,请不要忘记删除已经为express-fileupload模块添加的命令。(比如要求文件上传)


Luc*_*609 15

我在使用 multer 和 next js api 时遇到了这个问题。对我有用的是,我导出了一个将 bodyParser 设置为 false 的配置,如下所示;

export const config = {
  api: {
    bodyParser: false
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

您好,我遇到了同样的问题,就是缺少bodyParser允许我们的请求文件解析为Buffers.

我能够像这样快速解决问题:

   var bodyParser = require('body-parser')

bodyParser.json([options])
Run Code Online (Sandbox Code Playgroud)