在busboy文件上传中出现“多部分数据的意外结束”错误

时间:2017-05-11 02:46:16

标签: node.js express multer busboy

我正在使用connect-busboy在node / express app中上传文件。问题有时是有效的(文件上传得非常好),有时我得到错误Unexpected end of multipart data并且应用程序崩溃。可能是什么原因这个错误?此外,任何有关如何调试此功能的帮助将不胜感激。我正在使用node version 5connect-busboy": "0.2.14"提前谢谢

router.route('/images')    
  .post (function(req, res) {

  var fstream;
  req.busboy.on('file', function (fieldname, file, filename) {

    fstream = fs.createWriteStream(__dirname + '/public/img/'+ filename);
    file.pipe(fstream);
    file.on('end', function() {
      console.log('File [' + fieldname + '] Finished sucessfully');
     });
    fstream.on('error',function(err){
      console.log('fstream error' + err);
      file.unpipe();
    });
    fstream.on('close', function () {
      res.status(200);
      res.json({ message: 'File uploaded' });

    });
  });
  req.pipe(req.busboy);

});

这是我得到的错误

throw er; // Unhandled 'error' event
: Error: Unexpected end of multipart data
2017-05-07T20:28:27.599826+00:00 app[web.1]:     at 
/app/node_modules/busboy/node_modules/dicer/lib/Dicer.js:62:28

4 个答案:

答案 0 :(得分:0)

对我来说,在客户端格式化我的帖子正文时,使用\n换行符而不是\r\n换行符会收到此错误。

当我固定换行符时(如下面的代码所示),它起作用了。

fetch('/api/upload', 
  { method: 'POST',
    credentials: 'include',
    headers: {'Content-type': 'multipart/form-data; boundary=XXX' },
    body: '--XXX\r\nContent-Disposition: form-data; name="file"; filename="filename.csv"\r\nContent-Type: text/csv\r\n\r\nA,B,C\r\n1,1.1,name1\r\n2,2.2,name2\r\n\r\n--XXX--'
  });

答案 1 :(得分:0)

这是与Firebase工具相关的错误。今天,我在使用busboy软件包时遇到了这个问题,修复这个问题花了2个小时。我们只需要升级firebase工具即可解决此问题。

情况1:如果您已将Firebase工具安装为软件包依赖项,请在以下代码下运行

npm i firebase-tools

案例2:如果您已将Firebase工具安装为全局依赖项,请运行以下代码

npm i -g firebase-tools

firebase工具的工作版本:

enter image description here

我希望这会有所帮助,有关更多信息,请查看此问题link

答案 2 :(得分:0)

如果还有其他人对此有疑问,那么我的问题就在前端。使用Swift时,如果使用默认的URLSession配置,似乎会出现问题。我将其更改为:

let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil)

到以下:

  let sessionConfig = URLSessionConfiguration.background(withIdentifier: "it.yourapp.upload")
        sessionConfig.isDiscretionary = false
        sessionConfig.networkServiceType = .default

        let session = URLSession(configuration: sessionConfig, delegate: self, delegateQueue: OperationQueue.main)

现在效果很好!

答案 3 :(得分:0)

您可能会遗漏最终边界的短划线('-')。

https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html

示例:

Content-Type: multipart/alternative; boundary=boundary42 


--boundary42 
Content-Type: text/plain; charset=us-ascii 

...plain text version of message goes here.... 

--boundary42 
Content-Type: text/richtext 

.... richtext version of same message goes here ... 
--boundary42 
Content-Type: text/x-whatever 

.... fanciest formatted version of same  message  goes  here 
... 
--boundary42--