springboot ftp 笔记
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
?? ?private boolean uploadFile() {
?? ??? ?try {
?? ??? ??? ?StopWatch watch = new StopWatch();
?? ??? ??? ?watch.start();
?? ??? ??? ?// 創(chuàng)建一個ftp對象
?? ??? ??? ?FTPClient ftp = new FTPClient();
?? ??? ??? ?//ftp.setControlEncoding("GBK");
?? ??? ??? ?// ftp連接上去
?? ??? ??? ?ftp.connect(ftpHost, ftpPort);
?? ??? ??? ?// ftp登錄上去
?? ??? ??? ?ftp.login(ftpUsername, ftpPassword);
?? ??? ??? ?// 拿到返回碼,進(jìn)行判斷是否連接成功
?? ??? ??? ?Integer reply = ftp.getReplyCode();
?? ??? ??? ?// 連接失敗
?? ??? ??? ?if (!FTPReply.isPositiveCompletion(reply)) {
?? ??? ??? ??? ?ftp.disconnect();
?? ??? ??? ??? ?return false;
?? ??? ??? ?}
?? ??? ??? ?// 連接成功,準(zhǔn)備上傳
?? ??? ??? ?ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
?? ??? ??? ?// 獲取時間節(jié)點
?? ??? ??? ?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);
?? ??? ?}
?? ?}
這是上傳的相關(guān)代碼,但是在makeDirectory方法一直返回false,后來查下資料才發(fā)現(xiàn),這玩意不能創(chuàng)建多級目錄,只能一層一層創(chuàng)建。
既然如此那就多寫幾個makeDirectory語句即可。
比如:
boolean makeResult = ftp.makeDirectory("/aa/");
boolean makeResult1 = ftp.makeDirectory("/aa/bb/");
?
踩坑:程序部署在linux服務(wù)器上,在windows上測試上傳沒問題,放到linux就出現(xiàn)在上傳卡死的情況,不報錯,不執(zhí)行,無反應(yīng)。
ftp.storeFile() 就是這個方法這里卡死,后來百度了下,說是因為在linux有主動和被動模式,linux有端口限制真正傳輸數(shù)據(jù)是通過
另外接口的,默認(rèn)是主動,所以得改成被動模式,需要在ftp.storeFile()前加上?ftp.enterLocalPassiveMode();?一定是ftp.storeFile()
前,不要在實例化時就掉用這個方法無效。像下面這樣緊挨著
ftp.enterLocalPassiveMode();
boolean storeResult = ftp.storeFile()
?
再提一點,如果服務(wù)器存在這個文件沒刪除權(quán)限是無法覆蓋掉的。
參考地址:https://blog.csdn.net/afei3418/article/details/54375858
1) 控制連接
客戶端希望與FTP服務(wù)器建立上傳下載的數(shù)據(jù)傳輸時,它首先向服務(wù)器的TCP 21端口發(fā)起一個建立連接的請求,FTP服務(wù)器接受來自客戶端的請求,完成連接的建立過程,這樣的連接就稱為FTP控制連接。
2) 數(shù)據(jù)連接
FTP控制連接建立之后,即可開始傳輸文件,傳輸文件的連接稱為FTP數(shù)據(jù)連接。FTP數(shù)據(jù)連接就是FTP傳輸數(shù)據(jù)的過程,它有兩種傳輸模式
PORT(主動)方式的連接過程是:客戶端向服務(wù)器的FTP端口(默認(rèn)是21)發(fā)送連接請求,服務(wù)器接受連接,建立一條命令鏈路。當(dāng)需要傳送數(shù)據(jù)時,客戶端在命令鏈路上用PORT命令告訴服務(wù)器:“我打開了XXXX端口,你過來連接我”。于是服務(wù)器從20端口向客戶端的XXXX端口發(fā)送連接請求,建立一條數(shù)據(jù)鏈路來傳送數(shù)據(jù)。
PASV(被動)方式的連接過程是:客戶端向服務(wù)器的FTP端口(默認(rèn)是21)發(fā)送連接請求,服務(wù)器接受連接,建立一條命令鏈路。當(dāng)需要傳送數(shù)據(jù)時,服務(wù)器在命令鏈路上用PASV命令告訴客戶端:“我打開了XXXX端口,你過來連接我”。于是客戶端向服務(wù)器的XXXX端口發(fā)送連接請求,建立一條數(shù)據(jù)鏈路來傳送數(shù)據(jù)。
?
?
轉(zhuǎn)載于:https://my.oschina.net/uwith/blog/1863935
總結(jié)
以上是生活随笔為你收集整理的springboot ftp 笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# async/await使用举例
- 下一篇: Linux监控平台搭建( zabbix监