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端口發送鏈接請求,創建一條數據鏈路來傳送數據。