天天看點

關于使用FTPClient建立檔案夾并上傳檔案遇到的問題

       需求:使用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]);
}
           

繼續閱讀