最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java文件目錄下載并打包成ZIP壓縮包

 更新時間:2024年10月29日 08:54:51   作者:CodeDevMaster  
這篇文章主要介紹了在Java中如何實現(xiàn)文件夾、文件目錄的遞歸下載并打包成ZIP壓縮包,文中的示例代碼講解詳細,有需要的可以參考下

在Java中如果要實現(xiàn)文件夾、文件目錄的遞歸下載并打包成ZIP壓縮包,可以通過以下步驟進行:

遍歷文件夾:使用遞歸方法遍歷指定目錄下的所有文件和文件夾

創(chuàng)建ZIP輸出流:使用java.util.zip包中的ZipOutputStream類創(chuàng)建ZIP文件

將文件添加到ZIP:將遍歷到的文件逐個添加到ZIP壓縮包中

單個文件目錄打包ZIP下載

單個文件目錄打包ZIP下載與文件目錄遞歸打包ZIP下載類似,首先來看看單個文件目錄中的文件是如何打包ZIP下載的。

/**
 * 下載指定文件夾及其所有文件的內容,并將其打包為 ZIP 文件。
 *
 * @param folderId 需要下載的文件夾 ID
 * @param response HTTP 響應對象,用于發(fā)送 ZIP 文件
 * @throws IOException 在處理輸入輸出時可能拋出異常
 */
public void downloadFolder(Integer folderId, HttpServletResponse response) throws IOException {
    // 校驗權限,檢查用戶是否有權限下載該文件夾
    Boolean isAuth = checkAuthService.checkAuthDownload(folderId);
    if (!isAuth) {
        // 如果沒有權限,則拋出業(yè)務異常
        throw new BusinessException(TipsConstant.Tips_6002);
    }

    // 查詢指定文件夾下的所有文件列表
    List<FileOrg> fileOrgList = getFileBeansByFolderId(folderId);
    // 獲取文件夾信息,用于設置 ZIP 文件的名稱
    FolderOrg folderOrg = folderOrgMappr.selectById(folderId);

    // 準備壓縮文件的數(shù)據(jù)
    try (ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream())) {
        // 設置響應頭,準備發(fā)送 ZIP 文件
        prepareResponse(response, folderOrg.getName());
        // 將文件添加到 ZIP 壓縮包中
        addFilesToZip(zipOutputStream, fileOrgList, folderOrg.getName());
    } catch (IOException e) {
        // 如果發(fā)生錯誤,返回 500 錯誤和錯誤信息
        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Failed to download folder: " + e.getMessage());
    }
}

這里首先假設有一個目錄:測試目錄,里面有文件與文件目錄。以下是針對單個文件目錄打包ZIP下載實現(xiàn)的一個效果截圖。

遞歸文件目錄打包ZIP下載

遞歸文件目錄打包ZIP下載相比單個文件目錄打包ZIP下載,無非是多了個遞歸文件目錄的操作。

    @Override
    public void recursiveDownload(Integer folderId, HttpServletResponse response) throws IOException {
         // 校驗權限,檢查用戶是否有權限下載該文件夾
    Boolean isAuth = checkAuthService.checkAuthDownload(folderId);
    if (!isAuth) {
        // 如果沒有權限,則拋出業(yè)務異常
        throw new BusinessException(TipsConstant.Tips_6002);
    }

        // 獲取文件夾信息,用于設置 ZIP 文件的名稱
	    FolderOrg folderOrg = folderOrgMappr.selectById(folderId);

        // 準備壓縮文件的數(shù)據(jù)
        try (ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream())) {
	        // 設置響應頭,準備發(fā)送 ZIP 文件
            prepareResponse(response, folderOrg.getName());
            // 遞歸調用將子文件夾及其文件添加到 ZIP
            addFolderToZip(zipOutputStream, folderId, folderOrg.getName());
        } catch (IOException e) {
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Failed to download folder: " + e.getMessage());
        }
    }

 這里首先假設有一個目錄:測試目錄,里面有文件與嵌套文件目錄。以下是針對遞歸文件目錄打包ZIP下載實現(xiàn)的一個效果截圖。

設置響應頭

基于上述代碼,實現(xiàn)響應頭的設置方法。在準備將文件打包成 ZIP 文件之前,需要設置 HTTP 響應的相關信息,包括字符編碼、內容類型和文件名稱。這將確保用戶在下載時能夠正確識別文件類型。

/**
 * 準備 HTTP 響應,設置響應頭以便下載 ZIP 文件。
 *
 * @param response  HTTP 響應對象
 * @param folderName 文件夾名稱,用于生成 ZIP 文件的名稱
 * @throws IOException 在設置響應頭時可能拋出異常
 */
private void prepareResponse(HttpServletResponse response, String folderName) throws IOException {
    // 設置字符編碼
    response.setCharacterEncoding("UTF-8");
    // 設置下載文件的名稱,使用 URL 編碼以兼容特殊字符
    response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(folderName + ".zip", "UTF-8"));
    // 設置內容類型為 ZIP 文件
    response.setContentType("application/zip");
}

遞歸添加文件夾及文件

基于上述代碼,實現(xiàn)addFolderToZip方法是實現(xiàn)遞歸的關鍵。它首先獲取當前文件夾中的文件列表,然后將這些文件添加到ZIP中。接著,它會獲取當前文件夾的所有子文件夾,并對每個子文件夾遞歸調用自身。

    /**
     * 遞歸處理文件夾及其子文件夾
     * 1.首先獲取當前文件夾的文件列表,并調用 addFilesToZip 方法將文件添加到 ZIP 中。
     * 2.然后獲取當前文件夾的子文件夾,并遞歸調用 addFolderToZip 方法處理每個子文件夾
     * @param zipOutputStream ZipOutputStream
     * @param folderId 文件夾ID
     * @throws IOException IO異常
     */
    private void addFolderToZip(ZipOutputStream zipOutputStream, Integer folderId, String parentFolderName) throws IOException {
        // 獲取當前文件夾的文件列表
        List<FileOrg> fileOrgList = getFileBeansByFolderId(folderId);

        // 將當前文件夾的文件添加到 ZIP
        addFilesToZip(zipOutputStream, fileOrgList,parentFolderName);

        // 獲取當前文件夾的子文件夾
        List<FolderOrg> subFolders = getSubFoldersByFolderId(folderId);
        for (FolderOrg subFolder : subFolders) {
            // 遞歸調用將子文件夾及其文件列表添加到 ZIP
            addFolderToZip(zipOutputStream, subFolder.getId(),parentFolderName + "/" + subFolder.getName());
        }
    }

獲取子文件目錄與文件列表

獲取子文件夾與文件列表需根據(jù)自身業(yè)務實現(xiàn),這里基于數(shù)據(jù)庫查詢子文件目錄,查詢文件目錄下的文件,同時又涉及了一些處理業(yè)務邏輯。

1.獲取當前文件夾的所有子文件夾

    /**
     * 獲取指定文件夾下的所有子文件夾。
     * @param folderId 文件夾ID
     * @return List<FolderOrg>
     */
    private List<FolderOrg> getSubFoldersByFolderId(Integer folderId) {
        QueryWrapper<FolderOrg> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("deleted",0).eq("parent_id", folderId);
        List<FolderOrg> folderOrgs = folderOrgMappr.selectList(queryWrapper);
        return folderOrgs;
    }

2.獲取文件夾下的文件列表

/**
 * 根據(jù)文件夾 ID 獲取該文件夾下的所有文件信息。
 *
 * @param folderId 文件夾 ID
 * @return 文件組織列表,包含該文件夾下的所有文件信息
 */
private List<FileOrg> getFileBeansByFolderId(Integer folderId) {
    // 創(chuàng)建查詢條件,查找該文件夾下的所有文件鏈接
    QueryWrapper<FileLinkOrg> queryWrapper1 = new QueryWrapper<>();
    queryWrapper1.eq("folder_id", folderId);
    List<FileLinkOrg> fileLinkOrgList = fileLinkOrgMapper.selectList(queryWrapper1);
    
    // 如果沒有文件,返回空列表
    if (fileLinkOrgList.isEmpty()) {
        return new ArrayList<FileOrg>(0);
    }

    // 創(chuàng)建文件 ID 和名稱的映射關系
    HashMap<String, String> fileNameMap = new HashMap<>();
    fileLinkOrgList.forEach(item -> fileNameMap.put(item.getFileId(), item.getFileName()));

    // 獲取文件夾下所有文件的 ID
    ArrayList<String> fileIdList = new ArrayList<>(fileLinkOrgList.size());
    fileLinkOrgList.forEach(item -> fileIdList.add(item.getFileId()));

    // 根據(jù)文件 ID 查詢文件存儲信息
    QueryWrapper<FileOrg> queryWrapper2 = new QueryWrapper<>();
    queryWrapper2.in("id", fileIdList);
    List<FileOrg> fileOrgList = fileOrgMapper.selectList(queryWrapper2);

    // 更新文件組織列表中的文件名稱
    fileOrgList.forEach(item -> item.setFileName(fileNameMap.get(item.getId())));

    return fileOrgList;
}

將文件添加到ZIP中

基于上述代碼,實現(xiàn)addFilesToZip方法。需要將查詢到的文件添加到 ZIP 輸出流中。使用 ZipOutputStream 類來處理 ZIP 文件的創(chuàng)建和寫入。在寫入每個文件時,需要確保使用正確的路徑和名稱。

/**
 * 將指定文件列表中的文件添加到 ZIP 輸出流中。
 *
 * @param zipOutputStream ZIP 輸出流
 * @param fileOrgList 文件組織列表,包含待添加的文件信息
 * @throws IOException 在處理輸入輸出時可能拋出異常
 */
private void addFilesToZip(ZipOutputStream zipOutputStream, List<FileOrg> fileOrgList,String parentFolderName) throws IOException {
    // 遍歷文件列表,將每個文件添加到 ZIP
    for (FileOrg fileOrg : fileOrgList) {
        try (InputStream inputStream = minioUtils.getObject(fileOrg.getBucketName(), fileOrg.getFilePath())) {
         	// 設置 ZIP 條目的路徑,包括文件夾名稱
            String zipEntryName = parentFolderName + "/" + fileOrg.getFileName();
            // 創(chuàng)建 ZIP 條目,使用文件名稱
            zipOutputStream.putNextEntry(new ZipEntry(zipEntryName));
            byte[] buffer = new byte[2048];
            int length;
            // 讀取文件內容并寫入 ZIP 輸出流
            while ((length = inputStream.read(buffer)) > 0) {
                zipOutputStream.write(buffer, 0, length);
            }
            // 關閉當前 ZIP 條目
            zipOutputStream.closeEntry();
        } catch (Exception e) {
            // 記錄異常信息,繼續(xù)處理其他文件
            log.info("-------------------- 打包ZIP下載異常: {}--------------------", e.getMessage());
        }
    }
}

到此這篇關于Java文件目錄下載并打包成ZIP壓縮包的文章就介紹到這了,更多相關Java文件目錄下載內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java語言描述存儲結構與鄰接矩陣代碼示例

    Java語言描述存儲結構與鄰接矩陣代碼示例

    這篇文章主要介紹了Java語言描述存儲結構與鄰接矩陣代碼示例,涉及Java存儲結構,鄰接矩陣,鄰接表的介紹與比較,然后分享了鄰接矩陣的Java實現(xiàn)等相關內容,具有一定借鑒價值,需要的朋友可以參考。
    2017-11-11
  • SpringCloud分布式鏈路跟蹤的方法

    SpringCloud分布式鏈路跟蹤的方法

    這篇文章主要介紹了SpringCloud分布式鏈路跟蹤的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • SSH框架實現(xiàn)表單上傳圖片實例代碼

    SSH框架實現(xiàn)表單上傳圖片實例代碼

    本篇文章主要介紹了SSH框架實現(xiàn)表單上傳圖片實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • HDFS-Hadoop NameNode高可用機制

    HDFS-Hadoop NameNode高可用機制

    本文詳細介紹了Hadoop NameNode高可用機制的各個方面內容,NameNode 的可用性直接決定了 Hadoop 集群的可用性,感興趣的小伙伴可以參考本文章
    2021-08-08
  • MyBatis-Plus條件構造器Wrapper應用實例

    MyBatis-Plus條件構造器Wrapper應用實例

    QueryWrapper是用于查詢的Wrapper條件構造器,可以通過它來構建SELECT語句中的WHERE條件,這篇文章主要介紹了MyBatis-Plus數(shù)據(jù)表操作條件構造器Wrapper,需要的朋友可以參考下
    2023-09-09
  • Java中Spring的創(chuàng)建和使用詳解

    Java中Spring的創(chuàng)建和使用詳解

    這篇文章主要介紹了Java中Spring的創(chuàng)建和使用詳解,Spring 是?個包含了眾多?具?法的 IoC 容器,既然是容器那么 它就具備兩個最基本的功能,將對象存儲到容器中,從容器中將對象取出來,需要的朋友可以參考下
    2023-08-08
  • MyBatis動態(tài)SQL實現(xiàn)配置過程解析

    MyBatis動態(tài)SQL實現(xiàn)配置過程解析

    這篇文章主要介紹了MyBatis動態(tài)SQL實現(xiàn)配置過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • django 遞歸查詢評論的示例詳解

    django 遞歸查詢評論的示例詳解

    文章介紹了將表數(shù)據(jù)轉換為樹狀結構以及如何處理扁平化數(shù)據(jù)的方法,探討了在數(shù)據(jù)管理中的應用和實現(xiàn)技術,感興趣的朋友一起看看吧
    2025-01-01
  • Spring Security 單點登錄與自動登錄機制的實現(xiàn)原理

    Spring Security 單點登錄與自動登錄機制的實現(xiàn)原理

    本文探討SpringSecurity實現(xiàn)單點登錄(SSO)與自動登錄機制,涵蓋JWT跨系統(tǒng)認證、RememberMe持久化Token存儲、安全工具類及最佳實踐,強調安全性與性能平衡對提升用戶體驗的重要性,感興趣的朋友一起看看吧
    2025-07-07
  • 新手了解java 集合基礎知識

    新手了解java 集合基礎知識

    今天小編就為大家分享一篇關于Java集合總結,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧,希望對你有所幫助
    2021-07-07

最新評論

安西县| 东阿县| 抚州市| 长治县| 临颍县| 朝阳市| 大同市| 奉节县| 瓮安县| 安宁市| 美姑县| 思南县| 南华县| 南部县| 淮南市| 扎鲁特旗| 永修县| 塔河县| 东海县| 广灵县| 荥经县| 河西区| 金堂县| 天祝| 益阳市| 瑞安市| 太白县| 平潭县| 商丘市| 红桥区| 栖霞市| 格尔木市| 曲阜市| 关岭| 临清市| 白水县| 新沂市| 镇平县| 台山市| 博乐市| 长春市|