我如何将变量流式传输到文件 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
为需要解包的目录。
这就是您所需要的!
我需要将回复保存到文件中。响应是从服务器返回的 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
为需要解包的目录。
这就是您所需要的!