@ResponseBody @RequestMapping("/szctest2") public void zip(HttpServletResponse response) throws Exception { String sourceFileName = "D:\\test"; //要壓縮的目錄 String zipName = "test.zip"; response.setContentType("application/octet-stream; charset=UTF-8"); response.setHeader("Content-Disposition", "attachment; filename="+zipName+""); //File zipFile = new File(zipFileName); System.out.println("壓縮中..."); //創建zip輸出流 ZipOutputStream out = new ZipOutputStream( response.getOutputStream()); //創建緩沖輸出流 BufferedOutputStream bos = new BufferedOutputStream(out); File sourceFile = new File(sourceFileName); //調用函數 compress(out,bos,sourceFile,sourceFile.getName()); bos.close(); out.close(); System.out.println("壓縮完成"); } public void compress(ZipOutputStream out,BufferedOutputStream bos,File sourceFile,String base) throws Exception { //如果路徑為目錄(文件夾) if(sourceFile.isDirectory()) { //取出文件夾中的文件(或子文件夾) File[] flist = sourceFile.listFiles(); if(flist.length==0)//如果文件夾為空,則只需在目的地zip文件中寫入一個目錄進入點 { System.out.println(base+"/"); out.putNextEntry( new ZipEntry(base+"/") ); } else//如果文件夾不為空,則遞歸調用compress,文件夾中的每一個文件(或文件夾)進行壓縮 { for(int i=0;i<flist.length;i++) { compress(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); int tag; System.out.println(base); //將源文件寫入到zip文件中 while((tag=bis.read())!=-1) { out.write(tag); } bis.close(); fos.close(); } }