springboot ftp 筆記

    private boolean uploadFile() {
        try {
            StopWatch watch = new StopWatch();
            watch.start();
            // 建立一個ftp對象
            FTPClient ftp = new FTPClient();
            //ftp.setControlEncoding("GBK");
            // ftp鏈接上去
            ftp.connect(ftpHost, ftpPort);
            // ftp登陸上去
            ftp.login(ftpUsername, ftpPassword);
            // 拿到返回碼,進行判斷是否鏈接成功
            Integer reply = ftp.getReplyCode();
            // 鏈接失敗
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return false;
            }
            // 鏈接成功,準備上傳
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);linux

            // 獲取時間節點
            Date now = new Date();
            SimpleDateFormat formatFile = new SimpleDateFormat("yyyy-MM-dd");
            String dateName = formatFile.format(now);
            String dirName = String.format("/%s/%s", "OverDueStatic", dateName);
            boolean makeResult = ftp.makeDirectory(dirName);
            boolean changeResult = ftp.changeWorkingDirectory(dirName);
            FileInputStream fis = new FileInputStream(String.format("%1$s/%2$s/%2$s.xlsx", excelPath, dateName));
            boolean storeResult = ftp.storeFile(String.format("%s/%s.xlsx", dirName, dateName), fis);
            fis.close();
            watch.stop();
            log.info(String.format("上傳文件至ftp完成,耗時:%s", watch.getLastTaskTimeMillis()));
            return true;
        } catch (Exception e) {
            // TODO: handle exception
            throw new RuntimeException(e);
        }
    }windows

這是上傳的相關代碼,可是在makeDirectory方法一直返回false,後來查下資料才發現,這玩意不能建立多級目錄,只能一層一層建立。服務器

既然如此那就多寫幾個makeDirectory語句便可。測試

好比:.net

boolean makeResult = ftp.makeDirectory("/aa/");
boolean makeResult1 = ftp.makeDirectory("/aa/bb/");excel

 

踩坑:程序部署在linux服務器上,在windows上測試上傳沒問題,放到linux就出如今上傳卡死的狀況,不報錯,不執行,無反應。orm

ftp.storeFile() 就是這個方法這裏卡死,後來百度了下,說是由於在linux有主動和被動模式,linux有端口限制真正傳輸數據是經過對象

另外接口的,默認是主動,因此得改爲被動模式,須要在ftp.storeFile()前加上 ftp.enterLocalPassiveMode(); 必定是ftp.storeFile()blog

前,不要在實例化時就掉用這個方法無效。像下面這樣緊挨着接口

ftp.enterLocalPassiveMode();
boolean storeResult = ftp.storeFile()

 

再提一點,若是服務器存在這個文件沒刪除權限是沒法覆蓋掉的。

參考地址:https://blog.csdn.net/afei3418/article/details/54375858

1) 控制鏈接

客戶端但願與FTP服務器創建上傳下載的數據傳輸時,它首先向服務器的TCP 21端口發起一個創建鏈接的請求,FTP服務器接受來自客戶端的請求,完成鏈接的創建過程,這樣的鏈接就稱爲FTP控制鏈接。

2) 數據鏈接

FTP控制鏈接創建以後,便可開始傳輸文件,傳輸文件的鏈接稱爲FTP數據鏈接。FTP數據鏈接就是FTP傳輸數據的過程,它有兩種傳輸模式
PORT(主動)方式的鏈接過程是:客戶端向服務器的FTP端口(默認是21)發送鏈接請求,服務器接受鏈接,創建一條命令鏈路。當須要傳送數據時,客戶端在命令鏈路上用PORT命令告訴服務器:「我打開了XXXX端口,你過來鏈接我」。因而服務器從20端口向客戶端的XXXX端口發送鏈接請求,創建一條數據鏈路來傳送數據。

PASV(被動)方式的鏈接過程是:客戶端向服務器的FTP端口(默認是21)發送鏈接請求,服務器接受鏈接,創建一條命令鏈路。當須要傳送數據時,服務器在命令鏈路上用PASV命令告訴客戶端:「我打開了XXXX端口,你過來鏈接我」。因而客戶端向服務器的XXXX端口發送鏈接請求,創建一條數據鏈路來傳送數據。  

相關文章
相關標籤/搜索