JAVA使用FTPClient上傳文件時總是為空,而使用FileZilla客戶端時卻不會。
后來查了下資料,FTP服務器有被動模式和主動模式。(具體查另外資料)
在JAVA中將FTPClient設置為被動模式即可解決問題。
?
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;import java.io.File;
import java.io.FileInputStream;/*** Created by Administrator on 2018/4/13.*/
public class FtpUtil {public void testFTPClient() throws Exception {try {//創建一個FTPClient對象FTPClient ftpClient = new FTPClient();//創建ftp鏈接ftpClient.connect("***.***.***.***", 21);//登錄ftp,使用用戶名和密碼ftpClient.login("****", "****");//讀取本地文件FileInputStream inputStream = new FileInputStream(new File("filePath"));//設置為被動模式(如上傳文件夾成功,不能上傳文件,注釋這行,否則報錯refused:connect )ftpClient.enterLocalPassiveMode();//設置上傳路徑ftpClient.changeWorkingDirectory("FTP服務器文件目錄");//修改上傳文件格式ftpClient.setFileType(FTP.BINARY_FILE_TYPE);System.out.println("1");//上傳文件ftpClient.storeFile("hello1.jpg", inputStream);System.out.println("2");//關閉鏈接ftpClient.logout();} catch (Exception e) {e.printStackTrace();throw e;}}
}
?
補充:
調用FTPClient.enterLocalPassiveMode();這個方法的意思就是每次數據連接之前,ftp client告訴ftp server開通一個端口來傳輸數據。為什么要這樣做呢,因為ftp server可能每次開啟不同的端口來傳輸數據,但是在linux上,由于安全限制,可能某些端口沒有開啟,所以就出現阻塞。
到此問題圓滿解決!