目标
我们站在一个低容量的站点,用户(浏览器客户端)将选择图像文件(每个文件284 KB),然后请求Node Express Server将它们捆绑成ZIP以便下载到Web客户端。
问题&设计约束
问题
我们假设将7zip作为子进程运行是不好的,因为我们无法获得有关已将多少258KB文件添加到ZIP中的任何运行状态。
考虑到上面列出的设计约束/目标,以下哪个包是Node / ExpressJS友好包?
我上面看到的是,大多数软件包首先收集文件,然后将它们最终化为内存,然后将它们传输到http请求(可能不适合5GB的数据,或者我错过了什么)。有些人似乎能够使用磁盘,但问题是在添加每个文件时是否会获得更新事件?
其他人似乎完全异步,我不知道如何在每个文件添加到ZIP包中时获得正在运行的进度值。
答案 0 :(得分:1)
上面列出的包裹。大多数都不合适
我们选择了Archiver,因为它具有所需的大部分功能:
至于7zip解决方案。我们倾向于不喜欢从衍生的子进程中读取标准输出流的内脏。
答案 1 :(得分:0)
我们假设将7zip作为子进程运行是不好的,因为我们无法获得有关已将多少258KB文件添加到ZIP中的任何运行状态。
这似乎是一种错误的假设。
这样的命令行将显示添加到每个新文件时添加到stdout中的存档的每个文件的进度:
7z a -bsp1 -bb3 test.7z *
因此,您可以使用子进程模块从node.js启动它,并且您应该能够捕获stdout进度。您需要使用spawn
,而不是exec
,以便您可以实时获取stdout
数据。
将此作为子进程运行将使nodejs进程可以自由地为其他请求提供服务,并允许子进程管理自己的内存,而与nodejs无关。
7zip程序处理具有适当内存使用量的极大档案和文件。使用正确的标志来进行stdout并将其作为子进程运行,它似乎满足您的所有要求。