http://blog.csdn.net/beyondlpf/article/details/9343781這是我解決的的原文地址解析原因
在項目中使用commons-net.jar實現FTP文件的下載,在windows xp上運行正常,但是放到linux上,卻出現問題,程序運行到
FTPClient.listFiles()或者FTPClient.retrieveFile()方法時,就停止在那裏,什麼反應都沒有,出現假死狀態。google一把,發現很多人也出現了此類問題,最終在一個帖子裏找到了解決辦法。在調用這兩個方法之前,調用FTPClient.enterLocalPassiveMode();這個方法的意思就是每次數據連接之前,ftp client告訴ftp server開通一個端口來傳輸數據。爲什麼要這樣做呢,因爲ftp server可能每次開啓不同的端口來傳輸數據,但是在linux上或者其他服務器上面,由於安全限制,可能某些端口沒有開啓,所以就出現阻塞。OK,問題解決。
public void testFtpClient() {
//穿件一個ftp客戶對象
FTPClient ftpClient=new FTPClient();
FileInputStream inputStream = null;
try {
//創建ftp鏈接
ftpClient.connect("192.168.139.128", 21);
//登陸ftp服務器 用戶名 密碼
ftpClient.login("ftpuser", "a");
//讀取本地文件
inputStream=new FileInputStream(new File("F:\\照片\\1.jpg"));
//設置上傳路徑
ftpClient.changeWorkingDirectory("/home/ftpuser/www/image/");
//修改上傳文件格式
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setControlEncoding("UTF-8");
ftpClient.enterLocalPassiveMode();
//上傳文件 上傳文件名 上傳文檔的inputStream
System.out.println(ftpClient.storeFile(new String("hello.jpg".getBytes("UTF-8"),"iso-8859-1"), inputStream));
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
ftpClient.logout();
} catch (IOException e) {
e.printStackTrace();
}
if(inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
以上是我修改後的代碼 測試成功的 我的環境是在一個虛擬機上搭建一個ftp圖片服務器 用來保存我所有的文件等
之前沒有這句話就一直卡死在上傳那句代碼 但是並沒有報錯,假死幾十秒之後就返回了false 我估計是鏈接超時,因爲沒有開方端口。