我需要保存对文件的响应。响应是从服务器返回的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的损坏文件。我已经阅读了节点文档,但是无法正常工作。
我们非常感谢您的答复,如果可以的话,请详细说明。我觉得我需要使用某种类型的缓冲区。
答案 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
是需要在其中解压缩内容的目录。 这就是您所需要的!