原博客地址:https://blog.csdn.net/weixin_37766296/article/details/80044000
將多個文件壓縮並下載下來:(綠色為修改原博客的位置)
注意:需要使用<a>標簽來調用此方法,ajax不管用無法彈出選擇下載位置的彈窗
@RequestMapping("/uploads") public void recursion(String root, Vector<java.io.File> vecFile,HttpServletResponse response,HttpServletRequest request) throws IOException{ //根據路徑生成一個文件 root = "d:\\upload\\A-1-1-\\0001\\001\\001"; java.io.File file = new java.io.File(root); java.io.File[] subFile = file.listFiles(); //遍歷文件里面的所有文件 for (int i = 0; i < subFile.length; i++) { /*如果是文件夾,則遞歸下去尋找文件夾里面的文件*/ if (subFile[i].isDirectory()) { //recursion(subFile[i].getAbsolutePath(), vecFile); } else { //如果不是文件夾的話就直接添加到vector容器里面去 //將遍歷出來的文件進行壓縮和下載: // String filename = subFile[i].getName(); // vecFile.add(filename); vecFile.add(subFile[i]); } } //設置下載文件的名稱 String fileName = "temp1.zip"; response.setContentType("text/html; charset=UTF-8"); // 設置編碼字符 response.setContentType("application/x-msdownload"); // 設置內容類型為下載類型 response.setHeader("Content-disposition", "attachment;filename=" + fileName);// 設置下載的文件名稱 OutputStream out = response.getOutputStream(); // 創建頁面返回方式為輸出流,會自動彈出下載框 //創建壓縮文件需要的空的zip包 String zipBasePath = request.getSession().getServletContext().getRealPath("/logs/2/"); /* 輸出basePath的路徑,方便調試 */ System.out.println(zipBasePath); /* 創建壓縮文件需要的空的zip包 ,這里是自動生成的,不用我們自己去生成 */ String zipFilePath = zipBasePath + "temp.zip"; System.out.println("create the empty zip file successfully??????"); //根據臨時的zip壓縮包路徑,創建zip文件 java.io.File zip = new java.io.File(zipFilePath); if (!zip.exists()) { zip.createNewFile(); } System.out.println("create the zip file successfully"); // 創建zip文件輸出流 FileOutputStream fos = new FileOutputStream(zip); ZipOutputStream zos = new ZipOutputStream(fos); System.out.println("create the empty zip stream successfully"); //循環讀取文件路徑集合,獲取每一個文件的路徑(將文件一個一個進行壓縮) for (java.io.File fp : vecFile) { zipFile(fp, zos); // 將每一個文件寫入zip文件包內,即進行打包 } System.out.println("get the path successfully"); // fos.close();//如果這樣關兩次的話會報錯,java.io.IOException: Stream closed zos.close(); System.out.println("ok??"); //將打包后的文件寫到客戶端,使用緩沖流輸出 InputStream fis = new BufferedInputStream(new FileInputStream(zipFilePath)); byte[] buff = new byte[4096]; int size = 0; while ((size = fis.read(buff)) != -1) { out.write(buff, 0, size); } System.out.println("package is packed successfully"); //釋放和關閉輸入輸出流 out.flush();//清楚緩存 out.close(); fis.close(); } /** * 文件壓縮的方法 * @param inputFile * @param zipoutputStream */ public void zipFile(java.io.File inputFile, ZipOutputStream zipoutputStream) { try { if (inputFile.exists()) { // 判斷文件是否存在 if (inputFile.isFile()) { // 判斷是否屬於文件,還是文件夾 // 創建輸入流讀取文件 FileInputStream fis = new FileInputStream(inputFile); BufferedInputStream bis = new BufferedInputStream(fis); // 將文件寫入zip內,即將文件進行打包 ZipEntry ze = new ZipEntry(inputFile.getName()); // 獲取文件名 zipoutputStream.putNextEntry(ze); // 寫入文件的方法,同上 byte[] b = new byte[1024]; long l = 0; while (l < inputFile.length()) { int j = bis.read(b, 0, 1024); l += j; zipoutputStream.write(b, 0, j); } // 關閉輸入輸出流 bis.close(); fis.close(); } else { // 如果是文件夾,則使用窮舉的方法獲取文件,寫入zip try { java.io.File[] files = inputFile.listFiles(); for (int i = 0; i < files.length; i++) { zipFile(files[i], zipoutputStream); } } catch (Exception e) { e.printStackTrace(); } } } } catch (Exception e) { e.printStackTrace(); } }
對於單個文件下載:
可以參考:https://blog.csdn.net/alan_liuyue/article/details/72772502
參考博文:https://blog.csdn.net/alan_liuyue/article/details/72772502(里面關於流的關閉有點瑕疵)