【问题标题】:How to send a file as multipart/form-data from node.js when it is uploaded from client as multipart/form-data already?当文件已经从客户端上传为 multipart/form-data 时,如何从 node.js 将文件作为 multipart/form-data 发送?
【发布时间】:2021-08-10 23:50:03
【问题描述】:

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

我们正在使用 fetch 方法从 react 上传文件作为 multipart-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 })
      });
  });

现在扫描 api 也希望我们将文件作为多部分表单数据发送。在这种情况下,如何使用 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] 获取文件对象。在这种情况下,我们需要将文件数据转换为文件流吗?

【问题讨论】:

  • 这能回答你的问题吗? NodeJS Request how to send multipart/form-data POST request。你肯定采取了正确的方法:使用 multer;使用 POST。这个例子也可能有帮助:Handling File Uploads in Node.js with Express and Multer。如果您遇到错误:请复制/粘贴确切的错误消息!
  • 实际上并没有。我可以使用 multer 上传文件,但是一旦我们在 Node js 级别获得文件,我们希望将其发送到另一个 API,该 API 也希望它作为 multipart/form-data 发送。问题是如何在 formData.append 中附加文件。我们通常可以使用创建 BLOB 的 fileReadSync 来执行此操作,但如果文件已作为 multipart/form-data 上传,则不清楚如何将其更改为 BLOB 类型
  • 当您不厌其烦地复制/粘贴 EXACT ERROR msg 而不是模糊的“我遇到错误...”时,它确实很有帮助。这给了我们一些“确定”的东西,我们可以用谷歌搜索。但我理解你的问题是你想DIRECTLY 从请求对象(可能是“Blob”类型)转发二进制数据,而不是先保存到“文件”。对吗?
  • @paulsm:是的。我无法保存文件,因为它可能有一些恶意软件,而是通过将文件对象附加到表单数据来将文件对象作为 BLOB 传递。我不想输入错误消息,因为它含糊不清,当我自己用谷歌搜索时什么都得不到,但你是对的,应该添加错误消息。

标签: node.js reactjs multipartform-data multer form-data


【解决方案1】:

formData.append 期望文件为 Blob 我不明白 req.files[0] 的类型

但是如果这个文件有方法.arrayBuffer(),你可以试试

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

【讨论】:

  • 我可以试试。为了您的澄清,当我使用 multer 时,它会使上传到 Node.js 的文件在 req.files 属性中可用。我不确定这是什么类型,但我可以检查一下。
  • 它只是一个文件对象,我看不到其中的 arrayBuffer 方法。这里是对象结构字段名:'file' 编码:'7bit' 文件名:'421af876d134e34199e714ba72b7d744' mimetype:'application/pdf' originalname:'sample_pdf.pdf' path:'uploads\\421af876d134e34199e714ba72b7d744' destination:'uploads/' 大小: 3028 原型:对象
  • 我确认文件没有数组缓冲区属性,因此在 catch 块中出现错误,表明 file.arrayBuffer 不是函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2023-04-03
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
相关资源
最近更新 更多