Firebase函数多部分/表单数据错误

问题描述

我的网页提供了将pdf转换为图像的功能

对于网页,我正在使用Firebase托管;对于功能,我正在使用功能

但是文件上传功能在Firebase仪表板Boundary not found中记录了错误

以下是我用于上传html文件代码

function uploadFile() {
          var file = document.getElementById("file_input").files[0];
          var pass = document.getElementById("pass").value;
          console.log(file + pass);
          var formdata = new FormData();
          formdata.append("file",file);
          formdata.append("password",pass);
          var ajax = new XMLHttpRequest();
          ajax.upload.addEventListener("progress",progressHandler,false);
          ajax.addEventListener("load",completeHandler,false);
          ajax.addEventListener("error",errorHandler,false);
          ajax.addEventListener("abort",abortHandler,false);
          ajax.open("POST","/upload");
          ajax.setRequestHeader("Content-Type","multipart/form-data");
          ajax.send(formdata);
        }
     

这是功能代码

var functions = require('firebase-functions');
var process;
var Busboy;
var path = require('path');
var os = require('os');
var fs = require('fs');

exports.upload = functions.https.onRequest((req,res) => {
  const busboy = new Busboy({ headers: req.headers });
  const fields = {};
  const tmpdir = os.tmpdir();
  const uploads = {};
  const fileWrites = [];
  var pass = '';

  busboy.on('file',(fieldname,file,filename) => {

    console.log(`Processed file ${filename}`);
    const filepath = path.join(tmpdir,filename);
    uploads[fieldname] = filepath;

    const writeStream = fs.createWriteStream(filepath);
    file.pipe(writeStream);

    const promise = new Promise((resolve,reject) => {
      file.on('end',() => {
        writeStream.end();
      });
      writeStream.on('finish',resolve);
      writeStream.on('error',reject);
    });
    fileWrites.push(promise);
  });

  busboy.on('field',function (fieldname,val,fieldnameTruncated,valTruncated,encoding,mimetype) {
    pass = val;
  });

  busboy.on('finish',function () {
    console.log('Done parsing form!');
    console.log(pass);
    console.log(uploads);

    process.processCard(uploads['file'],pass,2).then((s) => {
      res.end(`
        <!DOCTYPE html>
        <html>
           <body>
              ImageConverted!!
              <img src="data:image/jpeg;base64,${s}" width="90%"></img> 
           </body>
        </html>
        `);
    }).catch((err) => { res.end('Error: ' + err) });
  });
  busboy.end(req.body);
}); 

我在做什么错了?

解决方法

对于多部分主体,建议使用req.rawBody代替req.body

https://stackoverflow.com/a/48289899/6003934