使用缓冲区复制 fs.createReadStream
Reproducing fs.createReadStream with a buffer
我需要使用 formData 将 pdf 发送到 api。
我下载的 pdf 记录后如下所示:<Buffer 6d 61 67 65 49 2f ... >
如果我 fs.writeFileSync
它是完全可读的。
但我想尝试将它传递给 api 而不必用 fs
编写它,以将 pdf 作为缓冲区进行操作。
我的 post 看起来像这样:
const formData = new FormData();
formData.append('access_key', this.config.redacted);
formData.append('redacted','redacted');
formData.append('file', fs.createReadStream('./filename.pdf'));
return post('urlRedacted', formData, {
headers: formData.getHeaders(),
})
这个请求会成功,但它要求我用 fs
写文件,我想避免这种情况。
我尝试了一些方法,比如使用库 node-streamifier
来帮助我从缓冲区创建可读流,但是 api 给我发回错误:{ error: 'Invalid parameter \'file\' or \'bucket\': Object expected' }
.
所以我的问题是,如何重现 fs.createReadStream
行为,这似乎是唯一适用于我的用例的行为?
注意:我尝试像这样实现 this solution:formData.append('file', createReadStream(myBuffer))
和像这样 formData.append('file', createReadStream(myBuffer,{ encoding: 'binary' }))
但没有对错误进行任何更改。
解决方案:
fs 正在流式传输数据,并智能地从它正在读取的文件中添加一些信息,因此在数据流的开头提供了这一行:
_streams:
[ '----------------------------622545709057705753853273\r\nContent-
Disposition: form-data; name="file"; filename="tickets.pdf"\r\nContent-Type: application/pdf\r\n\r\n',
这些数据必须是有效的上传,所以我将它们添加到我的 formData 中,如下所示:
formData.append("file", buffer, {contentType: "application/pdf", filename: "tickets.pdf"})
好像和Blob
有关系,我一无所知!但是这个解决方案非常有效!
我将 FormData 对象重新创建为 JSON 并最终使用了以下内容。
const formData = {
file: {
value: (my-file.pdf as a Buffer),
options: {
contentType: 'application/pdf',
filename: 'my-file.pdf'
}
}
我需要使用 formData 将 pdf 发送到 api。
我下载的 pdf 记录后如下所示:<Buffer 6d 61 67 65 49 2f ... >
如果我 fs.writeFileSync
它是完全可读的。
但我想尝试将它传递给 api 而不必用 fs
编写它,以将 pdf 作为缓冲区进行操作。
我的 post 看起来像这样:
const formData = new FormData();
formData.append('access_key', this.config.redacted);
formData.append('redacted','redacted');
formData.append('file', fs.createReadStream('./filename.pdf'));
return post('urlRedacted', formData, {
headers: formData.getHeaders(),
})
这个请求会成功,但它要求我用 fs
写文件,我想避免这种情况。
我尝试了一些方法,比如使用库 node-streamifier
来帮助我从缓冲区创建可读流,但是 api 给我发回错误:{ error: 'Invalid parameter \'file\' or \'bucket\': Object expected' }
.
所以我的问题是,如何重现 fs.createReadStream
行为,这似乎是唯一适用于我的用例的行为?
注意:我尝试像这样实现 this solution:formData.append('file', createReadStream(myBuffer))
和像这样 formData.append('file', createReadStream(myBuffer,{ encoding: 'binary' }))
但没有对错误进行任何更改。
解决方案:
fs 正在流式传输数据,并智能地从它正在读取的文件中添加一些信息,因此在数据流的开头提供了这一行:
_streams:
[ '----------------------------622545709057705753853273\r\nContent-
Disposition: form-data; name="file"; filename="tickets.pdf"\r\nContent-Type: application/pdf\r\n\r\n',
这些数据必须是有效的上传,所以我将它们添加到我的 formData 中,如下所示:
formData.append("file", buffer, {contentType: "application/pdf", filename: "tickets.pdf"})
好像和Blob
有关系,我一无所知!但是这个解决方案非常有效!
我将 FormData 对象重新创建为 JSON 并最终使用了以下内容。
const formData = {
file: {
value: (my-file.pdf as a Buffer),
options: {
contentType: 'application/pdf',
filename: 'my-file.pdf'
}
}