java.util.zip包 压缩、解压缩求解 要求:可以压缩、解压缩含有中文文件名的文件和文件夹 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 java.util.zip & Servlet 实现动态打包网络传输[转贴kingjava]问题我在写一个基于jsp/servlet的web应用程序,其中客户有一个需求,批量下载文件,当然首先需要先用java.util.zip打包(除了打包,没想到其他方法).由于是事先不知道客户要下哪个目录下的文件,并且文件目录下的文件也是会变的,所有要求动态的打包.方案有两种方案1)先将选定的的文件,打包放入临时文件夹,再让用户下载.2)将选定的文件,边打包,边下载.难点1)由于基于http协议的web是无连接的,将文件提供给用户下载,用户什么时候下载完成,服务器无法知道.而临时文件夹空间也是有限的,所以web服务器要把生成的zip文件删除.但要捕获到用户下载完成比较难.特别是文件传输中,用户突然把浏览器关闭.2)平常我们用zip类都是通过FileOutPutStream向磁盘写文件,没有通过网络向客户端写文件的,当然也不是说不可以,think in java中文第二版438页就说到"GZIP和ZIP程序库并非只能用来处理文件的压缩-他们当然可以压缩任何形式的数据,包括即将被传送至网络连线的数据。",遗憾的是Bruce Eckel没有留下事例代码.解决1)其实要删除文件也不是没有方法,用Session Tracking,实现HttpSessionBindingListener接口的valueUnbound方法在移除session对象的时候web服务器会自动调用这个方法,可以在这里删除临时生成的文件.(由于比较烦琐,所以没有实现,改用第二种方案)2)通过HttpServletResponse的getOutputStream()方法获得ServletOutputStream,然后再得到ZipOutputStream对象就可以了,其他的和普通的文件读写一样.源代码:package done.servlet;import java.io.*;import java.util.*;import java.util.zip.*;import javax.servlet.*;import javax.servlet.http.*;public class ZipDownLoad extends HttpServlet {/*** Handles GET requests*/public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置响应头,MIMEtype告诉浏览器传送的文件类型 response.setContentType( "application/x-zip-compressed" ); //inline;参数让浏览器弹出下载窗口,而不是在网页中打开文件.filename设定文件名 response.setHeader( "Content-Disposition" , "inline; filename=download.zip" ); //通过response获得ServletOutputStream对象 ServletOutputStream sos=response.getOutputStream(); //获得ZipOutputStream对象 ZipOutputStream out=new ZipOutputStream(new BufferedOutputStream(sos)); //得到要下载的文件对象 BufferedInputStream in=new BufferedInputStream(new FileInputStream("c:\\grub.exe")); //在zip文件中新建一个grub.exe文件 out.putNextEntry(new ZipEntry("grub.exe")); //逐字读出写入 int c; while((c = in.read())!=-1){ out.write(c); } in.close(); out.close(); //这里一句一定要,要不就会打开文件出错}/*** Handles POST requests*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request,response); }/*** Destroy the servlet*/public void destroy () {}}http://www.blog.edu.cn/user2/56202/archives/2006/1310402.shtml 对自己没有信心,不知道这样写线程是不是对的 google app engine for java swing 在JTable中插入图片 为什么图片和路径都显示出来了? 如何设计类的方法 请各位兄弟帮忙贴一下最近热贴"华为JAVA面试题"的URL地址,非常谢谢 JComboBox中ComboBoxModel 明天要去软脑面试,大家有什么建议?(急!在线等!) 用JAVA写一个程序最后得共多少种方式使一角,二角,五角组成一元 smartupload为什么不支持下载中文文件名呢? Java全屏窗口 关于用java播放声音的问题之LOOP方法 使用proxool-0.9.0RC2连接池内存泄漏问题?
我在写一个基于jsp/servlet的web应用程序,其中客户有一个需求,批量下载文件,当然首先需要先用java.util.zip打包(除了打包,没想到其他方法).
由于是事先不知道客户要下哪个目录下的文件,并且文件目录下的文件也是会变的,所有要求动态的打包.方案
有两种方案
1)先将选定的的文件,打包放入临时文件夹,再让用户下载.
2)将选定的文件,边打包,边下载.难点
1)由于基于http协议的web是无连接的,将文件提供给用户下载,用户什么时候下载完成,服务器无法知道.而临时文件夹空间也是有限的,所以web服务器要把生成的zip文件删除.但要捕获到用户下载完成比较难.特别是文件传输中,用户突然把浏览器关闭.
2)平常我们用zip类都是通过FileOutPutStream向磁盘写文件,没有通过网络向客户端写文件的,当然也不是说不可以,think in java中文第二版438页就说到"GZIP和ZIP程序库并非只能用来处理文件的压缩-他们当然可以压缩任何形式的数据,包括即将被传送至网络连线的数据。",遗憾的是Bruce Eckel没有留下事例代码.解决
1)其实要删除文件也不是没有方法,用Session Tracking,实现HttpSessionBindingListener接口的valueUnbound方法在移除session对象的时候web服务器会自动调用这个方法,可以在这里删除临时生成的文件.(由于比较烦琐,所以没有实现,改用第二种方案)
2)通过HttpServletResponse的getOutputStream()方法获得ServletOutputStream,然后再得到ZipOutputStream对象就可以了,其他的和普通的文件读写一样.
源代码:
package done.servlet;
import java.io.*;
import java.util.*;
import java.util.zip.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ZipDownLoad extends HttpServlet {/**
* Handles GET requests
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应头,MIMEtype告诉浏览器传送的文件类型
response.setContentType( "application/x-zip-compressed" );
//inline;参数让浏览器弹出下载窗口,而不是在网页中打开文件.filename设定文件名
response.setHeader( "Content-Disposition" , "inline; filename=download.zip" );
//通过response获得ServletOutputStream对象
ServletOutputStream sos=response.getOutputStream();
//获得ZipOutputStream对象
ZipOutputStream out=new ZipOutputStream(new BufferedOutputStream(sos));
//得到要下载的文件对象
BufferedInputStream in=new BufferedInputStream(new FileInputStream("c:\\grub.exe"));
//在zip文件中新建一个grub.exe文件
out.putNextEntry(new ZipEntry("grub.exe"));
//逐字读出写入
int c;
while((c = in.read())!=-1){
out.write(c);
}
in.close();
out.close(); //这里一句一定要,要不就会打开文件出错
}/**
* Handles POST requests
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
/**
* Destroy the servlet
*/
public void destroy () {
}
}
http://www.blog.edu.cn/user2/56202/archives/2006/1310402.shtml