如何将变量流式传输到文件Node JS?

时间:2019-02-21 10:59:42

标签: node.js save streamwriter

我需要保存对文件的响应。响应是从服务器返回的zip文件,该文件被接收为blob。我需要将zip文件另存为blob到本地计算机上。该应用程序本身就是Electron,文件需要存储在后台(不会打扰用户)。文件类型为zip(此后需要解压缩。

const writer = fs.createWriteStream(path.join(dir, 'files.zip'));
                writer.on('pipe', (src) => {
                  console.log('Something is piping into the writer.');
                });
                writer.end('This is the end\n');
                writer.on('finish', () => {
                  console.log('All writes are now complete.');
                });

writer.pipe(new Blob([response.data]));

我能做的最好的就是提供一个1kb的损坏文件。我已经阅读了节点文档,但是无法正常工作。

我们非常感谢您的答复,如果可以的话,请详细说明。我觉得我需要使用某种类型的缓冲区。

2 个答案:

答案 0 :(得分:1)

尝试一下

var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";

var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);

答案 1 :(得分:0)

所以我终于明白了。

我不得不返回Blob而不是返回类型arraybuffer。下一步是使用JSzip库并将我的函数转换为异步。

最终结果:

//Create JSZip object to read incoming blob
const zip = new JSZip;

try {
  //Await unpacked arrayBuffer
  const zippedFiles = (await zip.loadAsync(response.data, { createFolders: true })).files;

  for (const file of Object.values(zippedFiles)) {
    if (file.dir) {
      await mkdirAsync(path.join(dir, file.name), { recursive: true });
    } else {
        file
          .nodeStream()
          .pipe(fs.createWriteStream(path.join(dir, file.name)))
          .on("finish", console.log);
      }
    }
  } catch (e) {
   throw MeaningfulError;
 }

简而言之:此函数采用一个数组缓冲区(.zip类型)并将其解压缩到系统中。

  • response.data是arraybuffer(需要解压缩)。
  • dir是需要在其中解压缩内容的目录。

这就是您所需要的!