使用缓冲区重现fs.createReadStream

时间:2017-12-07 10:57:35

标签: javascript node.js pdf stream buffer

我需要使用formData将pdf发送到api。 我下载的pdf在记录时看起来像这样:<Buffer 6d 61 67 65 49 2f ... > 如果我fs.writeFileSync它是完全可读的。 但是我想尝试将它传递给api,而不必用fs来编写,以将pdf作为缓冲区来操作。 我的帖子看起来像这样:

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行为,这似乎是唯一适用于我的用例的行为?

注意:我尝试像formData.append('file', createReadStream(myBuffer))这样实施formData.append('file', createReadStream(myBuffer,{ encoding: 'binary' })),并且像_streams: [ '----------------------------622545709057705753853273\r\nContent- Disposition: form-data; name="file"; filename="tickets.pdf"\r\nContent-Type: application/pdf\r\n\r\n', 一样,但没有改变错误。

解决方案:

fs正在流式传输数据,并智能地从他正在阅读的文件中添加一些信息,从而在数据流的开头提供了这一行:

formData.append("file", buffer, {contentType: "application/pdf", filename: "tickets.pdf"})

这些数据必须是有效的上传,所以我将它们添加到我的formData中,如下所示: Blob

它似乎与emoji="[\uD800-\uDBFF]" [[ "" =~ $emoji ]] && echo "Emoji found!" 有关,我对此一无所知!但这个解决方案完美无缺!

1 个答案:

答案 0 :(得分:1)

我将FormData对象重新创建为JSON,并最终使用了以下内容。

const formData = {
  file: {
    value: (my-file.pdf as a Buffer),
    options: {
      contentType: 'application/pdf',
      filename: 'my-file.pdf'
    }
  }