sponsored links

SpringBoot專案整合FTP

寫在前面

FTP是一個檔案傳輸協議,被開發人員廣泛用於在網際網路中檔案傳輸的一套標準協議。

而我們通常在開發過程中也要透過FTP來搭建檔案系統,用於儲存系統檔案等。

目前正值SpringBoot熱潮,所以我們接下來會一起學習一下SpringBoot如何整合FTP,以及相關的FTP元件包,還有其主要提供的幾個方法。

當然在這系列文章結尾,我們還會給出確切的FTP操作工具類,算是一些小成果,希望和大家共勉。

FTP相關軟體安裝

我在此就不介紹如何安裝FTP了,但是我可以推薦給大家一些軟體作為選擇。

Linux版本,推薦使用vsftpd進行搭建FTP,只需要改指定的幾個配置,新增上使用者即可。

Windows版本,推薦使用Serv-U進行搭建FTP,圖形化介面,有中文版,操作起來很簡單。

開始整合

引入相關jar包

這裡我們對FTP相關的元件包使用的是edtFTPj,其實之前很多人都選擇的是Java自帶的包來實現FTP功能的。

在我們的SpringBoot專案中pom.xml下新增以下依賴。

<dependency>
    <groupId>com.enterprisedt</groupId>
    <artifactId>edtFTPj</artifactId>
    <version>1.5.3</version>
</dependency>
複製程式碼

更新maven進行引入,然後我們進行下一步。

引入FTPUtils.java和FTPHelper.java

引入兩個工具類。

我這裡先貢獻一下程式碼,請大家酌情作為參考。

/**
 * Ftp 工具類
 */
public class FtpHelper {

    private FTPClient ftp;

    public FtpHelper() {

    }

    /**
     * 初始化Ftp資訊
     *
     * @param ftpServer   ftp伺服器地址
     * @param ftpPort     Ftp埠號
     * @param ftpUsername ftp 使用者名稱
     * @param ftpPassword ftp 密碼
     */
    public FtpHelper(String ftpServer, int ftpPort, String ftpUsername,
                     String ftpPassword) {
        connect(ftpServer, ftpPort, ftpUsername, ftpPassword);
    }

    /**
     * 連線到ftp
     *
     * @param ftpServer   ftp伺服器地址
     * @param ftpPort     Ftp埠號
     * @param ftpUsername ftp 使用者名稱
     * @param ftpPassword ftp 密碼
     */
    public void connect(String ftpServer, int ftpPort, String ftpUsername, String ftpPassword) {
        ftp = new FTPClient();
        try {
            ftp.setControlEncoding("UTF-8");
            ftp.setRemoteHost(ftpServer);
            ftp.setRemotePort(ftpPort);
            ftp.setTimeout(6000);
            ftp.setConnectMode(FTPConnectMode.ACTIVE);
            ftp.connect();
            ftp.login(ftpUsername, ftpPassword);
            ftp.setType(FTPTransferType.BINARY);
        } catch (Exception e) {
            e.printStackTrace();
            ftp = null;
        }
    }

    /**
     * 更改ftp路徑
     *
     * @param ftp
     * @param dirName
     * @return
     */
    public boolean checkDirectory(FTPClient ftp, String dirName) {
        boolean flag;
        try {
            ftp.chdir(dirName);
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
            flag = false;
        }
        return flag;
    }

    /**
     * 斷開ftp連結
     */
    public void disconnect() {
        try {
            if (ftp.connected()) {
                ftp.quit();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 讀取ftp檔案流
     *
     * @param filePath ftp檔案路徑
     * @return s
     * @throws Exception
     */
    public InputStream downloadFile(String filePath) throws Exception {
        InputStream inputStream = null;
        String fileName = "";
        filePath = StringUtils.removeStart(filePath, "/");
        int len = filePath.lastIndexOf("/");
        if (len == -1) {
            if (filePath.length() > 0) {
                fileName = filePath;
            } else {
                throw new Exception("沒有輸入檔案路徑");
            }
        } else {
            fileName = filePath.substring(len + 1);

            String type = filePath.substring(0, len);
            String[] typeArray = type.split("/");
            for (String s : typeArray) {
                ftp.chdir(s);
            }
        }
        byte[] data;
        try {
            data = ftp.get(fileName);
            inputStream = new ByteArrayInputStream(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return inputStream;
    }

    /**
     * 上傳檔案到ftp
     *
     * @param file     檔案物件
     * @param filePath 上傳的路徑
     * @throws Exception
     */
    public void uploadFile(File file, String filePath) throws Exception {
        InputStream inStream = new FileInputStream(file);
        uploadFile(inStream, filePath);
    }

    /**
     * 上傳檔案到ftp
     *
     * @param inStream 上傳的檔案流
     * @param filePath 上傳路徑
     * @throws Exception
     */
    public void uploadFile(InputStream inStream, String filePath)
            throws Exception {
        if (inStream == null) {
            return;
        }
        String fileName = "";
        filePath = StringUtils.removeStart(filePath, "/");
        int len = filePath.lastIndexOf("/");
        if (len == -1) {
            if (filePath.length() > 0) {
                fileName = filePath;
            } else {
                throw new Exception("沒有輸入檔案路徑");
            }
        } else {
            fileName = filePath.substring(len + 1);
            String type = filePath.substring(0, len);
            String[] typeArray = type.split("/");
            for (String s : typeArray) {
                if (!checkDirectory(ftp, s)) {
                    ftp.mkdir(s);
                }
            }
        }
        ftp.put(inStream, fileName);
    }

    /**
     * 刪除ftp檔案
     *
     * @param filePath 檔案路徑
     * @throws Exception
     */
    public void deleteFile(String filePath) throws Exception {
        String fileName = "";
        filePath = StringUtils.removeStart(filePath, "/");
        int len = filePath.lastIndexOf("/");
        if (len == -1) {
            if (filePath.length() > 0) {
                fileName = filePath;
            } else {
                throw new Exception("沒有輸入檔案路徑");
            }
        } else {
            fileName = filePath.substring(len + 1);

            String type = filePath.substring(0, len);
            String[] typeArray = type.split("/");
            for (String s : typeArray) {
                if (checkDirectory(ftp, s)) {
                    ftp.chdir(s);
                }
            }
        }
        ftp.delete(fileName);
    }

    /**
     * 切換目錄
     *
     * @param path
     * @throws Exception
     */
    public void changeDirectory(String path) {
        if (!ValidateUtils.isEmpty(path)) {
            try {
                ftp.chdir(path);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}
複製程式碼
/**
 * Ftp 工具類
 */
public class FtpHelper {

    private FTPClient ftp;

    public FtpHelper() {

    }

    /**
     * 初始化Ftp資訊
     *
     * @param ftpServer   ftp伺服器地址
     * @param ftpPort     Ftp埠號
     * @param ftpUsername ftp 使用者名稱
     * @param ftpPassword ftp 密碼
     */
    public FtpHelper(String ftpServer, int ftpPort, String ftpUsername,
                     String ftpPassword) {
        connect(ftpServer, ftpPort, ftpUsername, ftpPassword);
    }

    /**
     * 連線到ftp
     *
     * @param ftpServer   ftp伺服器地址
     * @param ftpPort     Ftp埠號
     * @param ftpUsername ftp 使用者名稱
     * @param ftpPassword ftp 密碼
     */
    public void connect(String ftpServer, int ftpPort, String ftpUsername, String ftpPassword) {
        ftp = new FTPClient();
        try {
            ftp.setControlEncoding("UTF-8");
            ftp.setRemoteHost(ftpServer);
            ftp.setRemotePort(ftpPort);
            ftp.setTimeout(6000);
            ftp.setConnectMode(FTPConnectMode.ACTIVE);
            ftp.connect();
            ftp.login(ftpUsername, ftpPassword);
            ftp.setType(FTPTransferType.BINARY);
        } catch (Exception e) {
            e.printStackTrace();
            ftp = null;
        }
    }

    /**
     * 更改ftp路徑
     *
     * @param ftp
     * @param dirName
     * @return
     */
    public boolean checkDirectory(FTPClient ftp, String dirName) {
        boolean flag;
        try {
            ftp.chdir(dirName);
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
            flag = false;
        }
        return flag;
    }

    /**
     * 斷開ftp連結
     */
    public void disconnect() {
        try {
            if (ftp.connected()) {
                ftp.quit();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 讀取ftp檔案流
     *
     * @param filePath ftp檔案路徑
     * @return s
     * @throws Exception
     */
    public InputStream downloadFile(String filePath) throws Exception {
        InputStream inputStream = null;
        String fileName = "";
        filePath = StringUtils.removeStart(filePath, "/");
        int len = filePath.lastIndexOf("/");
        if (len == -1) {
            if (filePath.length() > 0) {
                fileName = filePath;
            } else {
                throw new Exception("沒有輸入檔案路徑");
            }
        } else {
            fileName = filePath.substring(len + 1);

            String type = filePath.substring(0, len);
            String[] typeArray = type.split("/");
            for (String s : typeArray) {
                ftp.chdir(s);
            }
        }
        byte[] data;
        try {
            data = ftp.get(fileName);
            inputStream = new ByteArrayInputStream(data);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return inputStream;
    }

    /**
     * 上傳檔案到ftp
     *
     * @param file     檔案物件
     * @param filePath 上傳的路徑
     * @throws Exception
     */
    public void uploadFile(File file, String filePath) throws Exception {
        InputStream inStream = new FileInputStream(file);
        uploadFile(inStream, filePath);
    }

    /**
     * 上傳檔案到ftp
     *
     * @param inStream 上傳的檔案流
     * @param filePath 上傳路徑
     * @throws Exception
     */
    public void uploadFile(InputStream inStream, String filePath)
            throws Exception {
        if (inStream == null) {
            return;
        }
        String fileName = "";
        filePath = StringUtils.removeStart(filePath, "/");
        int len = filePath.lastIndexOf("/");
        if (len == -1) {
            if (filePath.length() > 0) {
                fileName = filePath;
            } else {
                throw new Exception("沒有輸入檔案路徑");
            }
        } else {
            fileName = filePath.substring(len + 1);
            String type = filePath.substring(0, len);
            String[] typeArray = type.split("/");
            for (String s : typeArray) {
                if (!checkDirectory(ftp, s)) {
                    ftp.mkdir(s);
                }
            }
        }
        ftp.put(inStream, fileName);
    }

    /**
     * 刪除ftp檔案
     *
     * @param filePath 檔案路徑
     * @throws Exception
     */
    public void deleteFile(String filePath) throws Exception {
        String fileName = "";
        filePath = StringUtils.removeStart(filePath, "/");
        int len = filePath.lastIndexOf("/");
        if (len == -1) {
            if (filePath.length() > 0) {
                fileName = filePath;
            } else {
                throw new Exception("沒有輸入檔案路徑");
            }
        } else {
            fileName = filePath.substring(len + 1);

            String type = filePath.substring(0, len);
            String[] typeArray = type.split("/");
            for (String s : typeArray) {
                if (checkDirectory(ftp, s)) {
                    ftp.chdir(s);
                }
            }
        }
        ftp.delete(fileName);
    }

    /**
     * 切換目錄
     *
     * @param path
     * @throws Exception
     */
    public void changeDirectory(String path) {
        if (!ValidateUtils.isEmpty(path)) {
            try {
                ftp.chdir(path);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}
複製程式碼

如何使用

    public static void main(String[] args) {
        try {
            // 從ftp下載檔案
            FtpHelper ftp = new FtpHelper("127.0.0.1", 21, "root", "123456");
            File file = new File("D:\1.doc");
            ftp.uploadFile(file, "test/weradsfad2.doc");
            ftp.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

作者:Ijiran
連結:https://juejin.cn/post/7022817255779991589
來源:稀土掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

分類: 國際
時間: 2021-10-24

相關文章

泰國首個水上菜場,已有上百年曆史,與中國淵源頗深

泰國首個水上菜場,已有上百年曆史,與中國淵源頗深
泰國首個水上菜場,已有上百年曆史,與中國淵源頗深 我們聽說過菜市場,自由市場,但是水上菜場聽過的卻很少,我們在水上可以做的事情很多,比如泛舟劃湖,和友人在船上飲酒作樂,又或者水上游艇,體會水中的刺激, ...

颱風“圓規”挾狂風暴雨襲菲律賓 已致至少11人死
影片截圖 中新網10月13日電 綜合報道,颱風"圓規"襲擊菲律賓,帶來狂風暴雨,引發泥石流,洪水淹沒村鎮.菲律賓當局12日稱,"圓規"造成至少11人死亡和7人失 ...

國內院校考研停招專業已公佈,考研人抓緊檢視
大家好,我是事兒姐,點選上方"關注",每天為你分享考研最新資訊和乾貨. 9月初,教育部發布了2022年最新考研時間.正在備考的小夥伴是不是感覺吃了定心丸?學姐想說,為時過早.院校資 ...

美國對多國重開國門,包括中國,但疫情仍嚴峻,日均死數千人

美國對多國重開國門,包括中國,但疫情仍嚴峻,日均死數千人
美國白宮週一宣佈,從11月初開始,美國將取消對Covid-19的旅行限制,允許來自英國和大多數歐盟國家的已接種疫苗的乘客進入美國.除了英國和歐洲的26個申根國家,放寬限制也將適用於愛爾蘭.中國.伊朗. ...

兩輪車“換電”風口已至,千億市場空間爆發在即

兩輪車“換電”風口已至,千億市場空間爆發在即
中國的兩輪電動車市場規模非常大,達到千億元級別.據不完全統計,目前中國的兩輪電動車日均騎行大概有7億次,每天有1.2億次左右的充電需求.不過,現在傳統電動兩輪車在充電中有幾個比較明顯的痛點. 首先,安 ...

最適合考公務員的10個專業,招錄人數最多,上千個崗位可以去

最適合考公務員的10個專業,招錄人數最多,上千個崗位可以去
2022國考還有1個月左右就要釋出公告了,對於廣大考生來說,這是一年中最好的上岸機會. 不過要注意的是,國考的限制條件是比較多的,除了我們熟知的年齡.學歷以外,專業也是一道非常高的門檻.從近幾年的情況 ...

防城港是為宜居養老而生的城市,冬暖夏涼,已獲得更多北方人喜愛

防城港是為宜居養老而生的城市,冬暖夏涼,已獲得更多北方人喜愛
隨著生活水平越來越高,衍生出一個有趣的群體,叫做"候鳥式養老"人群.這也意味著,北方人冬季南遷,將成為未來的一個趨勢. 許多北方的離退休老年人,忙碌了一輩子,有條件和願望找一個有山 ...

跨境金融服務商“XTransfer”D輪融資完成 已服務數千家河南跨境電商出口企業
[大河報·大河財立方](記者 張克瑤)一站式外貿企業跨境金融和風控服務公司"XTransfer"宣佈完成D輪融資,由D1 Capital Partners領投,老股東跟投,光源資本 ...

西班牙拉帕爾馬島火山噴發 已有5000多人被疏散
當地時間19號15點12分,西班牙度假勝地拉帕爾馬島老昆布雷火山發生噴發.畫面顯示,島上多處岩漿噴發,煙塵滾滾,並引發山火.目前,當地已有5000多名居民和遊客被疏散.西班牙警方和國民警衛隊已派出直升 ...

專科就能報考,三類公務員崗位,工作“體面”但沒人想去

專科就能報考,三類公務員崗位,工作“體面”但沒人想去
每年一到公考季,就會有無數人關注.能選到心儀崗位的早早就交完報名費,等待考試.選不到崗位的,被條件限制排除在外的人,就大肆在網上評論. 年齡為什麼限制到35週歲?學歷低為什麼不能報名?等等問題鋪天蓋地 ...

36氪首發 |「海容材料」 已完成數千萬元Pre-A輪融資,推動Mini /Micro LED封裝防護材料產業化

36氪首發 |「海容材料」 已完成數千萬元Pre-A輪融資,推動Mini /Micro LED封裝防護材料產業化
作者:李亞靜 編輯:Lina 36氪獲悉,深圳海容高新材料科技有限公司(以下簡稱"海容材料")已完成數千萬Pre-A輪融資,此輪融資領投方為中電光谷旗下投資機構零度資本,融資資金主 ...

中央機關及其直屬機構2022年度公務員招考計劃招錄3.12萬人
新華社北京10月14日電(記者丁小溪)記者14日從國家公務員局獲悉,中央機關及其直屬機構2022年度公務員招考報名即將開始.本次招考共有75個部門.23個直屬機構參加,計劃招錄3.12萬人. 考生可於 ...

西鳳酒已不是陝西人的首選,這5種白酒口感好不上頭,價格還不貴

西鳳酒已不是陝西人的首選,這5種白酒口感好不上頭,價格還不貴
陝西曆地大物博,歷史文化悠久,除了許多名勝古蹟之外,還有很多地理標誌性特產,其中西鳳酒就是聞名全國的白酒,作為鳳香型的代表,它深受大家的喜愛.西鳳酒雖然是"中國四大名酒",可是並沒 ...

你們都應該知道的辦理公積金貸款的流程指南已呈上,請收藏

你們都應該知道的辦理公積金貸款的流程指南已呈上,請收藏
購房者應該知道的辦理公積金貸款的流程. 一.借款申請人諮詢 借款申請人至貸款經辦部門或致電貸款經辦部門進行住房公積金貸款諮詢,準備住房公積金貸款相關材料. 二.借款申請人至貸款經辦部門辦理初審及相關評 ...

中國已超過1000萬人的姓達25個

中國已超過1000萬人的姓達25個
姓氏文化是中國傳統文化的重要組成部分,其源於上古延至當代,傳承數千年,如今已經成為了國人生活中必不可少的一部分,是一個人一生中最重要的身份符號之一. 中國人素來講究"家國情懷",而 ...

澳大利亞亂了!警察被抗議者撞倒在地並被踩踏,已抓數百人

澳大利亞亂了!警察被抗議者撞倒在地並被踩踏,已抓數百人
9月18日,澳大利亞警方在未經批准的反封鎖集會上,在墨爾本逮捕了235人,在悉尼逮捕了32人,幾名警察在與抗議者的衝突中受傷.維多利亞州警方表示,週六的暴力事件中有六名警察需要住院治療.警方說,電視畫 ...

美加州山火逼近紅杉樹林 全球最大樹木已包上保護層

美加州山火逼近紅杉樹林 全球最大樹木已包上保護層
來源:參考訊息網 參考訊息網9月20日報道據美聯社加利福尼亞州三河訊息,19日炎熱乾燥的天氣讓加州消防員面臨更多挑戰,他們正奮力阻止火焰進一步衝入古老的紅杉樹叢中,在那裡全球最高樹木的底部被包裹在保護 ...

芬蘭科學家已透過“細胞農業”成功地在實驗室中培育咖啡

芬蘭科學家已透過“細胞農業”成功地在實驗室中培育咖啡
隨著世界人口的不斷增長,為養活所有這些飢餓的人而對環境造成的壓力也越來越大,而解決方案的一部分可能就在實驗室裡.我們已經看到了實驗室培育的肉類,如肉眼牛排.漢堡或雞肉卷,可以幫助解決與牲畜生產相關的巨 ...

淮安公務員申論指導:讓我們幹掉提出對策題中的異類
申論提出對策難嗎?估計每位同學都會給出自己的答案,但應該有很多同學會認為不難.確實,提出對策題分值高還有一定的自由發揮空間.是很多同學的"鍾愛"題型,但是你真的會做提出對策題嗎?或 ...

警惕!蘋果原包裝已被國內仿製 iPhone 13恐有假貨

警惕!蘋果原包裝已被國內仿製 iPhone 13恐有假貨
此次的iPhone 13系列,不止像上一代的iPhone 12系列一樣,包裝中沒有充電器,而且就連包裝外部的塑膠包裝都沒了. 美其名曰"環保",取代塑膠包裝的則是帶背膠的手撕貼紙, ...