用缓冲区重现fs.createReadStream

我需要发送一个pdf到一个formData的api。 我下载的时候logging如下所示的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来帮助我从缓冲区中创build可读stream的方法,但是api发送给我一个错误: { error: 'Invalid parameter \'file\' or \'bucket\': Object expected' }

所以我的问题是,如何重现fs.createReadStream行为,这似乎是我的用例唯一工作?

注意:我试图像这样实现这个解决scheme : formData.append('file', createReadStream(myBuffer))并且像这样formData.append('file', createReadStream(myBuffer,{ encoding: 'binary' }))没有改变任何东西的错误。

解:

FS正在stream式传输数据,并智能地从他正在读取的文件中添加一些信息,从而在数据stream开始处提供了这一行:

 _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 ,我对此一无所知! 但这个解决scheme完美的工作