对于无法立即放入内存的大型内容,请将内容从数据库 流式传输 到响应。
这种事情实际上很简单。您不需要AJAX或websocket,可以通过用户单击的简单链接来流式传输大文件下载。而且现代的浏览器都有不错的下载管理器,它们都有自己的进度条-
为什么要重新发明轮子?
如果为此从头开始编写servlet,请访问数据库BLOB,获取其输入流,然后将内容复制到HTTP响应输出流。如果您具有Apache Commons
IO库,则可以使用IOUtils.copy(),否则您可以自己执行此操作。
可以使用ZipOutputStream快速创建ZIP文件。在响应输出流上(从servlet或框架提供的任何内容)创建一个,然后从数据库中获取每个BLOB,
putNextEntry()首先使用,然后如前所述对每个BLOB进行流式处理。
潜在的陷阱/问题:
- 根据下载大小和网络速度,请求可能需要很多时间才能完成。防火墙等可以阻止这种情况并尽早终止请求。
- 希望您的用户在请求这些文件时处于良好的公司网络中。如果是远程/躲闪/移动连接,情况会更糟(如果下载了2.0G的1.9G后掉线了,用户必须重新启动)。
- 它可能会给您的服务器带来一些负担,尤其是压缩巨大的ZIP文件时。
ZipOutputStream
如果这是一个问题,则可能值得在创建时关闭/关闭压缩功能。 - 2GB以上(或4 GB)的ZIP文件可能与某些ZIP程序有关。我认为最新的Java 7使用ZIP64扩展,因此此版本的Java将正确编写巨大的ZIP,但是客户端是否将具有支持大zip文件的程序?我以前肯定遇到过这些问题,尤其是在旧的Solaris服务器上



