Node.js FormData 和文件引用

问题描述 投票:0回答:1

假设我想使用 Fetch API 上传本地文件作为 Node.js 的 FormData 的一部分。

如果这是一个浏览器,我可能已经有一个文件或 blob 引用,例如来自 file 输入元素。在那种情况下,我只是将文件引用附加到 FormData 实例,用户代理负责从磁盘流式传输它,如下所示:

const formData = new FormData();
formData.append('file', fileInputElement.files[0]);

const res = await fetch(postURL, {
  method: 'POST',
  body: formData
});

现在,在 Node.js 的情况下,没有文件输入元素。我所拥有的只是磁盘上的路径。我如何从中获取 Blob 或文件引用?

我调查过的一些事情:

对于磁盘上的本地文件,有没有什么方法可以使用 Node.js 获取 FormData 可以使用的文件引用?

javascript node.js file form-data whatwg-streams-api
1个回答
0
投票

使用

form-data
包而不是 Node 的内置 FormData,您可以使用文件路径或
ReadableStream
在服务器上设置文件路径。
ReadableStream
,Node.js流,是文件的内容。要使用文件路径引用文件,您可以创建一个新的
FormData
对象并使用 append 方法将文件添加到其中。

// Append
const fs = require('fs');
const FormData = require('form-data');
const formData = new FormData();
formData.append('file', fs.createReadStream('/path/to/file'));

要使用

ReadableStream
引用文件,您可以将流直接传递给
append
方法:

// Append
const fs = require('fs');
const FormData = require('form-data');
const fileStream = fs.createReadStream('/path/to/file');
const formData = new FormData();
formData.append('file', fileStream);

使用键

FormData
将文件添加到
'file'
对象。然后,您可以使用
formData
对象向接受表单数据的服务器发出请求。

在 Node.js 中,您可以使用

FormData
类来创建和发送
multipart/form-data
请求。 如何使用
FormData
上传文件的示例:

const FormData = require('form-data');
const fs = require('fs');
const form = new FormData();
// add a file field
form.append('file', fs.createReadStream('/path/to/file'));
// add additional fields
form.append('name', 'John Doe');
form.append('email', '[email protected]');
// send the request
const response = await fetch('https://example.com/upload', {
  method: 'POST',
  body: form
});
console.log(await response.text());

在此示例中,

FormData
创建一个
multipart/form-data
请求,其中包含一个文件字段 (
file
) 和两个附加字段(
name
email
)。然后,我们使用
fetch
发送请求。 此外,
FormData
也可用于通过调用
multipart/form-data
为每个文件字段使用不同的文件来发送带有多个文件的
form.append
请求。

有关 Node.js 中

FormData
的更多信息,您可以找到有用的资源:

使用 FormData 对象 - MDN Web 文档

使用 Node.js 上传文件 - Felix 的 Node.js 指南

© www.soinside.com 2019 - 2024. All rights reserved.