Node.js 如何将变量流式传输到文件节点JS?

Node.js 如何将变量流式传输到文件节点JS?,node.js,save,streamwriter,Node.js,Save,Streamwriter,我需要保存对文件的响应。响应是从服务器返回的zip文件,该文件作为blob接收。我需要在本地计算机上以zip文件的形式保存到blob。应用程序本身是Electron,文件需要存储在后台(而不会打扰用户)。文件类型是zip(并且在此之后需要解压缩) const writer = fs.createWriteStream(path.join(dir, 'files.zip')); writer.on('pipe', (src) => {

我需要保存对文件的响应。响应是从服务器返回的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的损坏文件。我已经阅读了节点文档,但无法使其工作

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

试试这个

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

所以我终于明白了

我必须返回一个
arraybuffer
,而不是返回类型为
Blob
。下一步是使用JSzip库并将我的函数转换为async

最终结果:

//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;
 }
简而言之:此函数接受一个arraybuffer(类型为.zip)并将其解压缩到您的系统中

  • response.data
    是arraybuffer(需要解包)
  • dir
    是需要解压缩内容的目录

这就是您所需要的!

您使用的http服务器模块是什么?我通过Axios响应获得响应。数据。此外,我还可以做其他两件事(相关)在用户保存文件的地方使用“另存为”功能。并使用JSZip库重新压缩和保存文件。因此,收到的数据是正确的。因此,简而言之;axios如果我误解了,我很抱歉。从模块开始,我发现它是客户端版本。您在服务器端使用axios吗?不,这是客户端(Electron、VueJS、axios)。服务器是纯PHP,返回zip文件。如果您需要任何信息,请告诉我。我尝试了它,包括对响应和位置进行了一些修补。但是没有输出。但是,我确实收到了一个弃用警告
弃用警告:Buffer()由于安全性和可用性问题而弃用。请使用Buffer.alloc()、Buffer.allocUnsafe()或Buffer.from()方法。
谢谢。我已经尝试过了,现在没有任何响应。没有错误或成功输出。我尝试过对每个语句进行控制台日志记录(中世纪的方式,代码似乎没有通过
新缓冲区
语句。这很奇怪。可以运行
console.log(response.data)
console.log(typeof response.data)
并注释outputfCourse:
console.log(response.data)
生成
object
,而
typeof
生成
Blob(146757){size:146757,type:“application/octet stream”}
您似乎正在处理浏览器Blob,因此node fs module不会有帮助。请尝试上面的代码,并告诉我状态如何。