javaweb通過接口來實現多個文件壓縮和下載(包括單文件下載,多文件批量下載)


原博客地址: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(里面關於流的關閉有點瑕疵)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM