Node.js 如何将变量流式传输到文件节点JS?
我需要保存对文件的响应。响应是从服务器返回的zip文件,该文件作为blob接收。我需要在本地计算机上以zip文件的形式保存到blob。应用程序本身是Electron,文件需要存储在后台(而不会打扰用户)。文件类型是zip(并且在此之后需要解压缩)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) => {
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)并将其解压缩到您的系统中
是arraybuffer(需要解包)response.data
是需要解压缩内容的目录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不会有帮助。请尝试上面的代码,并告诉我状态如何。