我有一个 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/