//首先引入的文件为org.apache的切记不是jdk的
import org.apache.tools.zip.ZipOutputStream;
import org.apache.tools.zip.ZipEntry;
zip压缩要用到包apache-ant-zip-2.3.jar
下载地址http://www.java2s.com/Code/Jar/a/Downloadapacheant171jar.htm
/**
* 将文件打包下载
* @param path 路径
* @param request
* @param response
* @throws IOException
* @throws InstantiationException
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws InvocationTargetException
* @throws NoSuchMethodException
* @throws SecurityException
*/
@RequestMapping(value="/getZipByPath",method={RequestMethod.GET, RequestMethod.POST})
public void getZipByPath(String path,HttpServletRequest request,HttpServletResponse response) throws IOException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException{
logger.info("-> getZipByPath()");
ByteArrayOutputStream byteos = new ByteArrayOutputStream(); //将压缩文件暂存到此流中
ZipOutputStream out = new ZipOutputStream(byteos); //封装字节流
out.setEncoding("gbk"); //解决文件名乱码问题
BufferedOutputStream bos = new BufferedOutputStream(out); //创建缓冲输出流
path = request.getServletContext().getRealPath("declare_attached"+File.separator+path); //根据webroot下面文件路径得到绝对路径
File sourceFile = new File(path); //源文件(文件或文件夹)
if (sourceFile==null) {
logger.info("-> "+path+"文件已不存在");
return;
}
service.getZipByPath(out,bos,sourceFile,sourceFile.getName());
//bos.close(); //关闭这个会报流被关闭的错误,不知道为啥
out.close();
byteos.close();
//输出
response.reset();
response.setContentType("application/zip; charset=utf-8"); //告诉浏览器是zip格式,字节编码为utf-8
response.setHeader("Content-Disposition","attachment;Filename="+sourceFile.getName()+CommonTool.getNowDateStr3()+".zip"); //附件名
byteos.writeTo(response.getOutputStream()); //把字节流里面的东西写到response的输出流里面去
response.getOutputStream().flush();
}
方法
/**
* 打包zip下载
* @param out
* @param bos
* @param sourceFile 源文件
* @param base 文件名
* @throws IOException
*/
@Transactional(propagation = Propagation.NOT_SUPPORTED, isolation = Isolation.DEFAULT)
public void getZipByPath(ZipOutputStream out,BufferedOutputStream bos,File sourceFile,String base) throws IOException{
//如果路径为目录(文件夹)
if(sourceFile.isDirectory())
{
//取出文件夹中的文件(或子文件夹)
File[] flist = sourceFile.listFiles();
if(flist.length==0)//如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
{
out.putNextEntry( new ZipEntry(base+"/") );//只要有文件就可以,文件夹没有内容
}
else//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
{
for(int i=0;i<flist.length;i++)
{
getZipByPath(out,bos,flist[i],base+"/"+flist[i].getName());
}
}
}
else//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
{
out.putNextEntry( new ZipEntry(base) ); //生成文件,但是无内容!!!
//读取目标文件,将文件写入到指定文件中
FileInputStream fos = new FileInputStream(sourceFile);
BufferedInputStream bis = new BufferedInputStream(fos);
byte[] tag = new byte[1024];
//将源文件写入到zip文件中
int len;
while((len=bis.read(tag))!=-1)
{
bos.write(tag,0,len);
}
bos.flush(); //这句一定要写,不然得等到1024byte才会输出,这样会造成上一个文件的流输出到下一个文件里面
bis.close();
fos.close();
}
}
然后前端用a的href请求即可