javascript - 将 zip 文件流转换为磁盘上的文件

标签 javascript node.js express http zip

我有一个 Node 应用程序(称为 MiddleOne),我从中点击了另一个 Node 应用程序(称为 BiServer)。 BiServer只有1条路由,如下

app.get("/", (req, res) => {
  const file = `./zipFiles.zip`;
  return res.download(file);
});

“MiddleOne”应用程序向“BiServer”发送请求并获取文件(包含单个 .json 文件的 .zip 文件),但是我无法在“MiddleOne”服务器上重建并保存该 .zip 文件。

http
    .get("BiServer:3009", resp => {
      let data = "";

      resp.on("data", chunk => {
        data += chunk;
      });

      resp.on("end", () => {

        fs.writeFile("./filename.zip", data, err => {
          console.log(err ? "Error: " + err : "File saved");
          return res.send("file is saved on server");
        });
      });
    })
    .on("error", err => {
      console.log("Error: " + err.message);
    });

上面的数据对象具有以下内容:

"PK
�T6P    zipFiles/PK�T6P�E8FIzipFiles/zipFiles.json����R*K-*���S�RP�s
W�
��$VZ(Y))股k^zQ�Bjnbf�Bf�BAbq�/W-//PK
�T6P    $zipFiles/
 �c�����c����&�8����PK�T6P�E8FI$ 'zipFiles/zipFiles.json
 K�#����K�#����H�����PK��"

打开新创建的文件时出现错误,“文件已损坏”。如何在收到其他服务器的响应后重建 zip 文件?

最佳答案

writeFile 用于写入文件,在您的情况下,您将数据保存为字符串。文件具有 zip 扩展名并不能保证它是 zip 文件。 您实际上是将字符串(不可读的 block )写入文件,因此您不会得到不可读的文本文件而不是 zip 文件。 尝试将 block 转换为缓冲区,这应该可行:

http
    .get("BiServer:3009", resp => {
      let chunks = [];

      resp.on("data", chunk => {
        chunks.push(chunk);
      });
     //Don't use end, close is the last event and you should always cleanup in this
      resp.on("close", () => {
        fs.writeFile("./filename.zip", Buffer.concat(chunks), err => {
          console.log(err ? "Error: " + err : "File saved");
          return res.send("file is saved on server");
        });
      });
    })
    .on("error", err => {
      console.log("Error: " + err.message);
    });

此外,它会消耗大量内存,因为您在写入文件之前将所有数据加载到内存中,如果文件大小非常大,您将面临与内存相关的问题。 所以不要将整个文件保存在内存中。你应该尝试streams , 试试这个:

const fs=require("fs");
http
    .get("BiServer:3009", resp => {
      const fileWriteStream=fs.createWriteStream("fileName.zip");
      resp.pipe(fileWriteStream);
      resp.on("close", () => {
        Console.log("File written successfully.")
      });
    })
    .on("error", err => {
      console.log("Error: " + err.message);
    });

关于javascript - 将 zip 文件流转换为磁盘上的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59858827/

相关文章:

javascript - 非负集减法

javascript - 如何在node/loopback中同步调用model.find方法?

node.js - 在 Azure Functions (NodeJS) 中处理多个 HTTP 方法的正确方法是什么

node.js - 如何在 Express 中捕获(或记录)Response 对象的数据?

html - Node.js 与express.js 相比更强大

javascript - 动态写入的Web音频链接缓冲区

PHP 返回大量空格

javascript - Flash 消息未显示在页面重定向上

node.js - Socket IO 连接到 ws ://someAddress was interrupted while the page was loading

node.js - 在 View 中获取编译的 Jade 模板?