springboot ftp 笔记
為什么80%的碼農都做不了架構師?>>> ??
?? ?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);
?? ??? ??? ?// 獲取時間節點
?? ??? ??? ?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);
?? ??? ?}
?? ?}
這是上傳的相關代碼,但是在makeDirectory方法一直返回false,后來查下資料才發現,這玩意不能創建多級目錄,只能一層一層創建。
既然如此那就多寫幾個makeDirectory語句即可。
比如:
boolean makeResult = ftp.makeDirectory("/aa/");
boolean makeResult1 = ftp.makeDirectory("/aa/bb/");
?
踩坑:程序部署在linux服務器上,在windows上測試上傳沒問題,放到linux就出現在上傳卡死的情況,不報錯,不執行,無反應。
ftp.storeFile() 就是這個方法這里卡死,后來百度了下,說是因為在linux有主動和被動模式,linux有端口限制真正傳輸數據是通過
另外接口的,默認是主動,所以得改成被動模式,需要在ftp.storeFile()前加上?ftp.enterLocalPassiveMode();?一定是ftp.storeFile()
前,不要在實例化時就掉用這個方法無效。像下面這樣緊挨著
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端口發送連接請求,建立一條數據鏈路來傳送數據。
?
?
轉載于:https://my.oschina.net/uwith/blog/1863935
總結
以上是生活随笔為你收集整理的springboot ftp 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# async/await使用举例
- 下一篇: mac电脑简单好用的非主流程序