需求:使用FTPClient,根據上傳檔案和需要存放的檔案目錄,若FTP服務端不存在指定的檔案目錄,則建立;否則直接将檔案儲存至對應的檔案目錄中。
測試:感覺問題不大,直接寫代碼,做測試用例。用JAVA第三方的FTPClient作為工具,主要代碼如下:
public boolean FtpUpload(String fileName, String file, String fileDir) {
FTPClient ftp = new FTPClient();
// 建立FTP連接配接,登入,根據傳回碼,測試連接配接是否成功,此處省略.......
// 主要是下面代碼:
if(fileDir != null) {
ftp.makeDirectory(fileDir);// 建立檔案目錄
ftp.changeWorkingDirectory(fileDir);// 切換至檔案目錄準備上傳
}
// 下面省略一萬字........
}
因為本機為windows開發環境,順便正好有ftp服務端,測試:
FtpUpload("test.txt", "E:\\test.txt", "/DirA/DirB");
一切順利,如願在FTP目錄/DirA/DirB不存在的情況下,建立目錄并将test.txt寫入DirB目錄下。
接下來更換Linux下釋出的FTP服務,再用測試用例測試,發現建立目錄傳回false,無法建立目錄,也無法切換至指定目錄?難道是linux權限問題?
經過測試,在排除了權限問題等,檢視API,通過調用FTPClient.printWorkingDirectory()函數,發現使用windows釋出的FTP服務,列印的路徑為“/”,而用linux釋出的FTP服務,列印的路徑為“/home/ftp/”,為FTP的全路徑。
在這個情況下,使用相對路徑去建立FTP目錄,如下:
FtpUpload("test.txt", "E:\\test.txt", "DirA");
順利建立檔案目錄,并将檔案寫入DirA目錄下。
最後在調試過程中,還是無法通過指定"/DirA/DirB"方式,批量建立檔案目錄,但通過間接的方法可以搞定。
所謂間接方式,就是類似這樣:
//将檔案目錄按路徑分隔符讀取,然後分别建立
String[] ftppaths = ftppath.split("/");
for(int i=0; i<ftppaths.length; i++) {
ftp.makeDirectory(ftppaths[i]);
ftp.changeWorkingDirectory(ftppaths[i]);
}