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

How do i stream a variable to a file Node JS?

我需要将回复保存到文件中。响应是从服务器返回的 zip 文件,该文件作为 blob 接收。我需要在本地计算机上将 blob 保存为 zip 文件。应用本身是 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 的损坏文件。我已经阅读了节点文档,但我无法让它工作。

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

试试这个,

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);

所以我终于想通了。

而不是 return 类型的 Blob 我不得不 return 一个 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为需要解包的目录。

这就是您所需要的!