//首先引入的文件为org.apache的切记不是jdk的 import org.apache.tools.zip.ZipOutputStream; import org.apache.tools.zip.ZipEntry;
zip压缩要用到包apache-ant-zip-2.3.jar
下载地址
/** * 将文件打包下载 * @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
然后前端用a的href请求即可