当文件已作为多部分/表单数据从客户端上载时,如何从node.js以多部分/表单数据的形式发送?

当文件已作为多部分/表单数据从客户端上载时,如何从node.js以多部分/表单数据的形式发送?,node.js,reactjs,multipartform-data,multer,form-data,Node.js,Reactjs,Multipartform Data,Multer,Form Data,我有一个NodeJs/React应用程序。用例是上传一个文件,让第三方API扫描它,然后如果成功保存相同的文件。在扫描完成之前,我们无法保存文件 我们正在使用fetch方法从react以多部分formdata的形式上载该文件。一旦在Node.js中接收到文件以访问该文件并检查文件大小和类型,我们将使用multer,如下所示 router.post("/upload", upload.any("fieldname"), (req, res) =>

我有一个NodeJs/React应用程序。用例是上传一个文件,让第三方API扫描它,然后如果成功保存相同的文件。在扫描完成之前,我们无法保存文件

我们正在使用fetch方法从react以多部分formdata的形式上载该文件。一旦在Node.js中接收到文件以访问该文件并检查文件大小和类型,我们将使用multer,如下所示

  router.post("/upload", upload.any("fieldname"), (req, res) => {
    scanFiles(req.files[0])
      .then((data) => {
        global.logger.info("scanned successfully.....");
        res.status(200);
      })
      .catch((err) => {
        global.logger.info("scan api ended with errors", err);
        res.status(400).send({ error: err.message })
      });
  });
现在scanapi希望我们也将文件作为多部分表单数据发送。在这个场景中,如何使用req.files[0]中接收的字段来追加到formData。我尝试了下面的方法,但失败了

const formData = new FormData();
try {
  formData.append("file", file, "sample_pdf");
} catch (err) {
  global.logger.error("Form data ended with errors", err);
}

我在尝试执行相同操作时出错。似乎formData.append的第二个参数需要一个文件流,但需要从req.files[0]获取文件对象。在这种情况下,我们需要将文件数据转换为文件流吗?

formData.append expect file as Blob 我不了解请求文件的类型[0]

但是,如果此文件具有方法.arrayBuffer(),则可以尝试

file.arrayBuffer().then((array) => {
    formData.append('file', new Blob([array]), 'simple_pdf.pdf');
});

这回答了你的问题吗。你肯定采取了正确的方法:使用multer;使用POST。此示例也可能有帮助:。如果出现错误:请复制/粘贴准确的错误消息!实际上没有。我可以使用multer上传文件,但一旦我们在Node js级别获得文件,我们希望将其发送到另一个API,该API也希望将其作为多部分/表单数据发送。问题是如何在formData.append中追加文件。我们通常可以使用fileReadSync来创建BLOB,但如果文件已经作为多部分/表单数据上传,则无法明确如何将其更改为BLOB类型。当您不厌其烦地复制/粘贴准确的错误消息,而不是含糊不清的“我遇到了错误…”时,它确实很有帮助。这给了我们一些“明确”的东西,我们可以用谷歌搜索。但我理解您的问题是,您希望直接从请求对象(可能是“Blob”类型)转发二进制数据,而不首先保存到“文件”。对吗?@paulsm:对。我无法保存文件,因为它可能有一些恶意软件,而是通过将文件对象附加到表单数据以BLOB形式传递。我不想输入错误消息,因为它是模糊的,当我自己用谷歌搜索它时,无法得到任何东西,但你是正确的,应该添加错误消息。我可以试试。为了便于澄清,当我使用multer时,它使上传到Node.js的文件在req.files属性中可用。我不确定这是什么类型的,但我可以检查相同的。它只是一个文件对象,我没有看到它里面的arrayBuffer方法。以下是对象结构字段名:'file'编码:'7bit'文件名:'421af876d134e34199e714ba72b7d744'mimetype:'application/pdf'原始名称:'sample_pdf.pdf'路径:'uploads\\421af876d134e34199e714ba72b7d744'目标:'uploads/'大小:3028 proto:ObjectI确认文件没有数组缓冲区属性,因此在catch中出错阻止该文件。arrayBuffer不是函数