java.util.zip & Servlet实现动态打包网络传输
建space以来来,第一次写技术文章,见笑
问题
我在写一个基于jsp/servlet的web应用程序,其中客户有一个需求,批量下载文件,当然首先需要先用java.util.zip打包(除了打包,没想到其他方法). 由于是事先不知道客户要下哪个目录下的文件,并且文件目录下的文件也是会变的,所有要求动态的打包.
方案
有两种方案
- 先将选定的的文件,打包放入临时文件夹,再让用户下载.
- 将选定的文件,边打包,边下载.
难点
- 由于基于http协议的web是无连接的,将文件提供给用户下载,用户什么时候下载完成,服务器无法知道.而临时文件夹空间也是有限的,所以web服务器要把生成的zip文件删除.但要捕获到用户下载完成比较难.特别是文件传输中,用户突然把浏览器关闭.
- 平常我们用zip类都是通过FileOutPutStream向磁盘写文件,没有通过网络向客户端写文件的,当然也不是说不可以,think in java中文第二版438页就说到”GZIP和ZIP程序库并非只能用来处理文件的压缩-他们当然可以压缩任何形式的数据,包括即将被传送至网络连线的数据。”,遗憾的是Bruce Eckel没有留下事例代码.
解决
- 其实要删除文件也不是没有方法,用Session Tracking,实现HttpSessionBindingListener接口的valueUnbound方法在移除session对象的时候web服务器会自动调用这个方法,可以在这里删除临时生成的文件.(由于比较烦琐,所以没有实现,改用第二种方案)
- 通过HttpServletResponse的getOutputStream()方法获得ServletOutputStream,然后再得到ZipOutputStream对象就可以了,其他的和普通的文件读写一样.
源代码:
### 参考 1. 使用Java实现网络传输数据的压缩 2. jspSmartUpload上传组件 3. Thinking in Java 中文第二版