国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

文件夾的批量下載

這篇具有很好參考價(jià)值的文章主要介紹了文件夾的批量下載。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.業(yè)務(wù)背景

? ? ? ? 公司想實(shí)現(xiàn)文件系統(tǒng)下載,上次圖簡單就草率的寫了文件下載,這不趁著同事請(qǐng)假趕集吧這坑給填上。? ? ? ??

?文件夾的批量下載,java,筆記,java

2.遇到問題

? ? ? ? 剛準(zhǔn)備開始寫,就頭疼,文件只要獲得數(shù)據(jù)輸出流就行,但是這文件夾需要維護(hù)層級(jí)關(guān)系。文件夾的批量下載,java,筆記,java

? ? ? ? 前端給的是服務(wù)器的絕對(duì)地址,還得服務(wù)器的文件名對(duì)的上,不然的下載個(gè)1.doc 2.txt 3.image,另外得考慮到如果文件夾下面的文件路徑不存在會(huì)不會(huì)報(bào)錯(cuò)?

文件夾的批量下載,java,筆記,java

? ? ? ? ?因?yàn)槊總€(gè)文件夾的目錄的和流關(guān)聯(lián)起來 ,而且我們只知道下載的文件地址。所以在打成zip包的時(shí)候得考慮地址替換以及子文件夾創(chuàng)建的問題。

3.解決思路

? ? ? ? 解決方法很簡單,但可能一時(shí)半會(huì)給繞進(jìn)去了,都想半天了。

? ? ? ? 關(guān)于層級(jí)的問題:先去校驗(yàn)是否是文件進(jìn)行遞歸操作 沒啥難度

? ? ? ? 關(guān)于路徑的問題:使用下載路徑作為根目錄,是文件的時(shí)候?qū)⒛夸涍M(jìn)行傳遞,也無需在打成zip包在做解析

? ? ? ? 關(guān)于目錄的問題:需要做標(biāo)識(shí),文件放的是字節(jié)數(shù)組,文件夾放的是null,在對(duì)應(yīng)層級(jí)創(chuàng)建目錄即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-668082.html

4.代碼實(shí)現(xiàn)(展現(xiàn)ftp的實(shí)現(xiàn)方式)

? ? ? ? 1.下載

   /**
     * 批量下載文件或者文件夾
     *
     * @param host      服務(wù)器地址
     * @param port      端口號(hào)
     * @param username  用戶名
     * @param password  密碼
     * @param downPaths 遠(yuǎn)程路徑
     * @return void
     */

    public Map<String, byte[]> batchDownloadFilesOrFolder(String host, int port, String username, String password, List<String> downPaths) throws IOException {
        FTPClient ftp = getFtpClient(host, port, username, password);
        Map<String, byte[]> fileBytesMap = new HashMap<>();

        for (String downPath : downPaths) {
            // 檢查下載路徑是否為文件夾
            String rootPath = StringUtils.getFileName(downPath);
            FTPFile ftpFile = ftp.mlistFile(downPath);
            if (ftpFile != null && ftpFile.isDirectory()) {
                fileBytesMap.put(rootPath , null);
                // 如果是文件夾,則遞歸調(diào)用下載文件夾的方法
                downloadDirectory(ftp, downPath, rootPath, fileBytesMap);
            } else {
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

                if (!ftp.retrieveFile(downPath, outputStream)) {
                    // 文件下載失敗的處理邏輯,比如拋出異?;蛴涗浫罩?                } else {
                    fileBytesMap.put(rootPath, outputStream.toByteArray());
                }
            }
        }

        return fileBytesMap;
    }

    /**
     * 下載文件夾的方法
     *
     * @param ftp
     * @param directoryPath
     * @param rootPath              根目錄
     * @param fileBytesMap
     * @throws IOException
     */
    private void downloadDirectory(FTPClient ftp, String directoryPath, String rootPath, Map<String, byte[]> fileBytesMap) throws IOException {
        FTPFile[] files = ftp.listFiles(directoryPath);
        for (FTPFile file : files) {
            String filePath = directoryPath + "/" + file.getName();
            String relativePath = rootPath + "/" + file.getName();
            if (file.isFile()) {
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                if (!ftp.retrieveFile(filePath, outputStream)) {
                    // 文件下載失敗的處理邏輯,比如拋出異?;蛴涗浫罩?                } else {
                    fileBytesMap.put(relativePath, outputStream.toByteArray());
                }
            } else if (file.isDirectory()) {
                // 遞歸調(diào)用下載文件夾的方法
                fileBytesMap.put(relativePath, null);
                downloadDirectory(ftp, filePath, relativePath, fileBytesMap);
            }
        }
    }

? ? ? ? 2.打成zip包

    /**
     * 將下載的流寫入zip
     *
     * @param bytesMap
     * @param response
     */
    private void downStreamWriteZip(Map<String, byte[]> bytesMap, HttpServletResponse response){
        try {
            // 設(shè)置響應(yīng)頭
            response.setHeader("Content-Disposition", "attachment; filename=files.zip");
            response.setContentType("application/zip");

            // 創(chuàng)建輸出流
            ServletOutputStream outputStream = response.getOutputStream();
            ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);

            for (Map.Entry<String, byte[]> entry : bytesMap.entrySet()) {
                String fileName = entry.getKey();
                byte[] data = entry.getValue();
                if (data == null) {
                    // 文件夾,需要?jiǎng)?chuàng)建目錄結(jié)構(gòu)
                    ZipEntry zipEntry = new ZipEntry(fileName + "/");
                    zipOutputStream.putNextEntry(zipEntry);
                    zipOutputStream.closeEntry();
                } else {
                    // 文件,寫入文件數(shù)據(jù)
                    ZipEntry zipEntry = new ZipEntry(fileName);
                    zipOutputStream.putNextEntry(zipEntry);
                    zipOutputStream.write(data);
                    zipOutputStream.closeEntry();
                }
            }

            // 關(guān)閉流
            zipOutputStream.close();
            outputStream.close();
        } catch (IOException e) {
            // 處理異常
        }
    }

到了這里,關(guān)于文件夾的批量下載的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Lua 批量修改文件夾下文件名

    Lua 批量修改文件夾下文件名

    2024年02月16日
    瀏覽(109)
  • Excel怎么批量生成文件夾

    Excel怎么批量生成文件夾

    Excel怎么批量生成文件夾的鏈接: https://jingyan.baidu.com/article/ea24bc398d9dcb9b63b3312f.html

    2024年02月09日
    瀏覽(29)
  • MAC&Windows批量生成文件夾

    MAC&Windows批量生成文件夾

    在excel中復(fù)制要生成的子文件夾名,且在名字后面加上空格(不加空格直接生成文件夾,文件夾名字后面會(huì)有問號(hào))。并生成一個(gè)包含子文件夾名的txt文檔,如name.txt。mac中的txt文件可以在“文本編輯”中的“格式”選項(xiàng)卡中的“制作純文本”,再保存文件,就可以生成txt文件

    2024年02月12日
    瀏覽(21)
  • 文件夾路徑保存不同,什么批量修改名稱

    文件夾路徑保存不同,什么批量修改名稱

    在日常工作中不知道大家有沒有遇到過,需要批量修改文件夾名稱,并且文件夾保存路徑不同呢,像這種情況到底不能批量修改呢。我也問了很多身邊的朋友,他們有的說,他一般都修改保存路徑是同一個(gè),還很少遇到像我這樣情況,他們給的建議是,分次修改,一次修改同

    2024年02月05日
    瀏覽(22)
  • 文件管理秘籍:如何實(shí)現(xiàn)批量移動(dòng),每個(gè)文件夾僅存一個(gè)文件

    文件管理秘籍:如何實(shí)現(xiàn)批量移動(dòng),每個(gè)文件夾僅存一個(gè)文件

    在日常的生活和工作中,文件管理是一項(xiàng)常見的任務(wù)。有時(shí)候會(huì)遇到要把多個(gè)文件移動(dòng)到同一個(gè)文件夾,或者要每個(gè)文件夾中只包含一個(gè)文件的情況。下面一起來看云炫文件管理器如何批量移動(dòng)文件,有效地管理的文件。 詳情頁圖片被分類移動(dòng)文件夾中的前面截圖展示。 每

    2024年01月16日
    瀏覽(18)
  • mac批量提取文件夾的名稱,怎么操作?

    mac批量提取文件夾的名稱,怎么操作?

    ? ? mac批量提取文件夾的名稱,怎么操作?很多小伙伴想知道在mac電腦上可以一鍵快速批量的將大量文件夾的名提取出來,而不是采用一個(gè)一個(gè)名稱提取的方法,這是一個(gè)有利于提高工作效率的辦法,這一項(xiàng)技能在網(wǎng)上幾乎找不到解決辦法,不過經(jīng)過小編的多方打聽,還是給

    2024年02月16日
    瀏覽(16)
  • linux 再文件夾目錄下,批量替換文件名、文件內(nèi)容字符串

    基本使用命令 具體使用命令方法 1.替換文件內(nèi)容 搜索當(dāng)前目錄下所有.DTA文件,并將文件中字符串\\\"string1\\\",替換為\\\"string2\\\" 2.替換文件名 搜索當(dāng)前目錄下所有.DTA文件,并將文件名中字符串\\\"string1\\\"替換為\\\"string2\\\". 3.批量替換文件內(nèi)容 該目錄及子目錄下所有文件,將文件中所有的字符

    2024年02月16日
    瀏覽(98)
  • python如何批量讀取一個(gè)文件夾里的所以excel文件

    python如何批量讀取一個(gè)文件夾里的所以excel文件

    在數(shù)據(jù)分析工作中,嘗嘗需要處理多個(gè)不同月的excel文件,但無奈與excel文件的局限性,不能同時(shí)處理多個(gè)月的excel數(shù)據(jù),所以python的批量讀取excel文件就顯得十分重要,下面我將展示如何用python將每個(gè)月度的excel數(shù)據(jù)進(jìn)行讀取并匯總處理和輸出。 最好excel的文件名就是按照日期

    2024年02月16日
    瀏覽(96)
  • 如何批量提取不同文件夾下的圖片并隨機(jī)重命名

    如何批量提取不同文件夾下的圖片并隨機(jī)重命名

    無論是在為了跑深度學(xué)習(xí)模型而準(zhǔn)備數(shù)據(jù)集,還是其他的一些用途,相信大家都會(huì)遇到一個(gè)問題:我所需要的圖片分布在很多不同的文件夾下,但我不需要這么多文件夾,那么我如果要使用這些圖片的話,就需要把這些文件夾下的圖片一個(gè)個(gè)提取出來,然后再放到新建的文件

    2024年02月12日
    瀏覽(96)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包