目标
我们站在一个低容量的站点上,用户(浏览器客户端)将选择图像文件(每个文件284 KB ),然后请求Node Express Server将它们捆绑到一个ZIP中,以便下载到web客户端。
问题与设计约束
问题
我们假设将7zip作为子进程运行是不好的,因为我们不会获得任何运行状态,不知道有多少258 is文件被添加到ZIP中。
那么,考虑到上面列出的设计约束/目标,以下哪个包是非常友好的Node/ExpressJS包?
我在上面看到的是,大多数包首先收集文件,然后将它们最后保存到内存中,然后将它们传输到http请求(可能对5GB的数据不好,或者我遗漏了什么)。有些人似乎能够使用磁盘,但问题是,当每个文件被添加时,一个会得到更新事件吗?
其他文件似乎是完全异步的,我不知道如何在将每个文件添加到ZIP包时获得运行中的进度值。
发布于 2017-05-30 14:53:41
上面列出的软件包。大多数都不合适
我们选择了Archiver,因为它具有所需的大部分功能:
至于7zip解决方案。我们倾向于不喜欢从生成的子进程读取标准输出流的内部。
发布于 2017-05-26 19:25:18
我们假设将7zip作为子进程运行是不好的,因为我们不会获得任何运行状态,不知道有多少258 is文件被添加到ZIP中。
这似乎是一个错误的假设。
在添加每个新文件时,这样的命令行将显示在stdout上添加到存档中的每个文件的进度:
7z a -bsp1 -bb3 test.7z *因此,您可以使用子进程模块从node.js启动它,并且您应该能够在发生时捕获stdout进度。您需要使用spawn,而不是exec,这样就可以按发生的情况实时获取stdout数据。
将此进程作为子进程运行将保持nodejs进程为其他请求服务的自由,并允许子进程独立于nodejs管理自己的内存。
7zip程序使用适当的内存处理非常大的档案和文件。有了正确的标志,可以获得标准输出的进度,并将其作为子进程运行,它似乎满足了所有的需求。
https://stackoverflow.com/questions/44137677
复制相似问题