我将需要从Web应用程序中下载大量文件。
显然,这将是一项长期运行的操作( 每年[每个客户] 使用 一次 ),因此时间不是问题(除非遇到一些超时,但是我可以通过创建某种形式的Keepalive心跳)。我知道如何创建一个隐藏的 iframe 并使用它content-disposition: attachment来尝试下载文件,而不是在浏览器中打开它,以及如何为绘制进度表而建立客户端与服务器之间的通信;
content-disposition: attachment
下载的实际大小(和文件数)是未知的,但是为简单起见,我们可以将其实际上视为1GB,由100个文件组成,每个文件10MB。
由于这应该是一次单击操作,因此我首先想到的是将所有文件分组,同时从数据库中读取它们,并以动态生成的ZIP形式进行存储,然后要求用户保存ZIP。
问题是: 从WebApp中的多个小字节数组创建大型存档时,最佳实践是什么?已知的缺点和陷阱是什么?
可以随机分为:
对于无法立即放入内存的大型内容,请将内容从数据库 流式传输 到响应。
这种事情实际上很简单。您不需要AJAX或websocket,可以通过用户单击的简单链接来流式传输大文件下载。而且现代的浏览器都有不错的下载管理器,它们都有自己的进度条- 为什么要重新发明轮子?
如果为此从头开始编写servlet,请访问数据库BLOB,获取其输入流,然后将内容复制到HTTP响应输出流。如果您具有Apache Commons IO库,则可以使用IOUtils.copy(),否则您可以自己执行此操作。
可以使用ZipOutputStream快速创建ZIP文件。在响应输出流上(从servlet或框架提供的任何内容)创建一个,然后从数据库中获取每个BLOB,putNextEntry()首先使用,然后如前所述对每个BLOB进行流式处理。
putNextEntry()
潜在的陷阱/问题:
ZipOutputStream