将 zip 下载到文件中并使用 nodejs 将其解压缩 - 如何检测下载何时完成并且解压缩是安全的



我需要编写两个单独的组件 - 一个是下载器,它采用文件路径(或文件描述符,以看起来更好的为准)和url并将该URL中存在的任何文件下载到文件路径中。到目前为止,我为下载器组件编写的代码是: https://gist.github.com/akshita31/b3df6f8b45da342b7a8a4bd24cdf6c1c

下载完成后,我有一个安装程序组件,可以解压缩该文件描述符中存在的文件并将它们放在目标路径上。安装程序的代码是:https://gist.github.com/akshita31/9e86c1090622c462cc357b3374acba4c

我有第三个实用程序可以创建一个 tmp文件(使用 npm tmp) - https://gist.github.com/akshita31/92878afbb0943d3a95e14193ddf9f64b。

最后我做到了:

tmpFile = await createTmpFile();
await DownloadFile(tmpFile.fd, pkg.description, pkg.url, pkg.fallbackUrl, eventStream, provider);
await InstallPackage(tmpFile.fd, pkg.description, pkg.installPath, pkg.binaries, eventStream);

但是在安装中,我有时会得到 - "找不到中央目录记录签名的结尾",这对我来说表明该文件没有完全下载并放入所需的路径,我们正尝试在此之前阅读它。经过大量的谷歌搜索,我不知何故明白它可能必须在 WriteStream 上对"完成"事件做一些事情,但是如果我只是解决下载器,我的程序会等待很多时间然后超时。我做错了什么?

使用文件流,我意识到我可以在写入流上侦听"完成"事件,但这意味着 file.end,因此文件描述符将被关闭,这不是我们想要的。所以我改用缓冲区而不是将下载写入文件流,然后使用 yauzl.fromBuffer 从缓冲区读取 zip。

最新更新