javaftp是什麼-ag真人国际官网
ⅰ 用java實現ftp需要導入什麼包,導入哪裡呢,能不能改個包
com.jcraft.jsch_0.1.31.jar,commons-net-3.2.jar。這是我實現ftp上傳使用的jar,希望對你有用。
ⅱ java ftp 和 sftp的區別
ftp是文件傳輸協議。在網站上,如果你想把文件和人共享,最便捷的方式莫過於把文件上傳到ftp伺服器上,其他人通過ftp客戶端程序來下載所需要的文件。 ftp進行文件傳輸需要通過埠進行。一般所需埠為: 1. 控制鏈路—tcp埠21。控制器端。用於發送指令給伺服器以及等待伺服器響應。 2. 數據鏈路---tcp埠20。數據傳輸埠。用來建立數據傳輸通道的。主要用來從客戶向伺服器發送一個文件、從伺服器向客戶發送一個文件、從伺服器向客戶發送文件或目錄列表。 ftp為了適應不同的網路環境,支持主動連接和被動連接兩種模式。這兩種模式都主要針對數據鏈路進行的,跟控制鏈路無關。 ftp的安全隱患: 一、ftp伺服器軟體漏洞。 二、明文口令。 三、ftp旗標。 四、通過ftp伺服器進行埠掃描。 五、數據劫持。 ftp的安全策略: 一、使用較比安全的系統和ftp服務軟體。 二、使用密文傳輸用戶名和口令。 三、更改服務軟體的旗標。 四、加強協議安全性。 sftp是secure file transfer protocol的縮寫,是安全文件傳送協議。可以為傳輸文件提供一種安全的加密方法。跟ftp幾乎語法功能一樣。 sftp是ssh的一部分,是一種傳輸檔案至blogger伺服器的安全方式。它...
ⅲ java ftp被動模式 可以限制埠號范圍嗎
這個是ftp軟體配置,,,,,,客戶端和伺服器端,就會協商。
以vsftp為例子. 修改/etc/vsftpd/vsftpd.conf
新增底下四行
listen_port=21
pasv_enable=yes
pasv_min_port=9981
pasv_max_port=9986
ⅳ java ftp客戶端主動模式(port)下的源代碼
維護一個ftp的伺服器列表,包含ip埠用戶名密碼
定時的遞歸掃描每個ftp伺服器的目錄和文件,保存到本地資料庫
搜索的時候,從本地資料庫查詢
至於java訪問ftp伺服器的方法,已經有很多現成的實現
比如www.apache.org的commons-net里就有
有的版本的sun jdk自身就帶
ⅳ 怎麼用java代碼創建ftp用戶和密碼
創建ftp用戶名和密碼,其實就在ftp伺服器的用戶文件裡面添加條記錄。
方法有兩種,我說下思路。
一、你可以用java程序找到相應的配置文件,打開、把用戶名密碼寫入進去。ok了。
二、你用用java程序調用創建ftp用戶的命令,來創建ftp用戶。
ⅵ 怎麼用java實現ftp上傳
sun.net.ftp.ftpclient.,該類庫主要提供了用於建立ftp連接的類。利用這些類的方法,編程人員可以遠程登錄到ftp伺服器,列舉該伺服器上的目錄,設置傳輸協議,以及傳送文件。ftpclient類涵蓋了幾乎所有ftp的功能,ftpclient的實例變數保存了有關建立"代理"的各種信息。下面給出了這些實例變數:
public static boolean useftpproxy
這個變數用於表明ftp傳輸過程中是否使用了一個代理,因此,它實際上是一個標記,此標記若為true,表明使用了一個代理主機。
public static string ftpproxyhost
此變數只有在變數useftpproxy為true時才有效,用於保存代理主機名。
public static int ftpproxyport此變數只有在變數useftpproxy為true時才有效,用於保存代理主機的埠地址。
ftpclient有三種不同形式的構造函數,如下所示:
1、public ftpclient(string hostname,int port)
此構造函數利用給出的主機名和埠號建立一條ftp連接。
2、public ftpclient(string hostname)
此構造函數利用給出的主機名建立一條ftp連接,使用默認埠號。
3、ftpclient()
此構造函數將創建一ftpclient類,但不建立ftp連接。這時,ftp連接可以用openserver方法建立。
一旦建立了類ftpclient,就可以用這個類的方法來打開與ftp伺服器的連接。類ftpclient提供了如下兩個可用於打開與ftp伺服器之間的連接的方法。
public void openserver(string hostname)
這個方法用於建立一條與指定主機上的ftp伺服器的連接,使用默認埠號。
public void openserver(string host,int port)
這個方法用於建立一條與指定主機、指定埠上的ftp伺服器的連接。
打開連接之後,接下來的工作是注冊到ftp伺服器。這時需要利用下面的方法。
public void login(string username,string password)
此方法利用參數username和password登錄到ftp伺服器。使用過intemet的用戶應該知道,匿名ftp伺服器的登錄用戶名為anonymous,密碼一般用自己的電子郵件地址。
下面是ftpclient類所提供的一些控制命令。
public void cd(string remotedirectory):該命令用於把遠程系統上的目錄切換到參數remotedirectory所指定的目錄。
public void cdup():該命令用於把遠程系統上的目錄切換到上一級目錄。
public string pwd():該命令可顯示遠程系統上的目錄狀態。
public void binary():該命令可把傳輸格式設置為二進制格式。
public void ascii():該命令可把傳輸協議設置為ascii碼格式。
public void rename(string string,string string1):該命令可對遠程系統上的目錄或者文件進行重命名操作。
除了上述方法外,類ftpclient還提供了可用於傳遞並檢索目錄清單和文件的若干方法。這些方法返回的是可供讀或寫的輸入、輸出流。下面是其中一些主要的方法。
public telnetinputstream list()
返回與遠程機器上當前目錄相對應的輸入流。
public telnetinputstream get(string filename)
獲取遠程機器上的文件filename,藉助telnetinputstream把該文件傳送到本地。
public telnetoutputstream put(string filename)
以寫方式打開一輸出流,通過這一輸出流把文件filename傳送到遠程計算機
package myutil;
import java.io.datainputstream;
import java.io.file;
import java.io.fileinputstream;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.io.outputstream;
import java.util.arraylist;
import java.util.list;
import java.util.stringtokenizer;
import sun.net.telnetinputstream;
import sun.net.telnetoutputstream;
import sun.net.ftp.ftpclient;
/**
* ftp上傳,下載
*
* @author why 2009-07-30
*
*/
public class ftputil {
private string ip = "";
private string username = "";
private string password = "";
private int port = -1;
private string path = "";
ftpclient ftpclient = null;
outputstream os = null;
fileinputstream is = null;
public ftputil(string serverip, string username, string password) {
this.ip = serverip;
this.username = username;
this.password = password;
}
public ftputil(string serverip, int port, string username, string password) {
this.ip = serverip;
this.username = username;
this.password = password;
this.port = port;
}
/**
* 連接ftp伺服器
*
* @throws ioexception
*/
public boolean connectserver() {
ftpclient = new ftpclient();
try {
if (this.port != -1) {
ftpclient.openserver(this.ip, this.port);
} else {
ftpclient.openserver(this.ip);
}
ftpclient.login(this.username, this.password);
if (this.path.length() != 0) {
ftpclient.cd(this.path);// path是ftp服務下主目錄的子目錄
}
ftpclient.binary();// 用2進制上傳、下載
system.out.println("已登錄到\"" ftpclient.pwd() "\"目錄");
return true;
} catch (ioexception e) {
e.printstacktrace();
return false;
}
}
/**
* 斷開與ftp伺服器連接
*
* @throws ioexception
*/
public boolean closeserver() {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (ftpclient != null) {
ftpclient.closeserver();
}
system.out.println("已從伺服器斷開");
return true;
} catch (ioexception e) {
e.printstacktrace();
return false;
}
}
/**
* 檢查文件夾在當前目錄下是否存在
*
* @param dir
*@return
*/
private boolean isdirexist(string dir) {
string pwd = "";
try {
pwd = ftpclient.pwd();
ftpclient.cd(dir);
ftpclient.cd(pwd);
} catch (exception e) {
return false;
}
return true;
}
/**
* 在當前目錄下創建文件夾
*
* @param dir
* @return
* @throws exception
*/
private boolean createdir(string dir) {
try {
ftpclient.ascii();
stringtokenizer s = new stringtokenizer(dir, "/"); // sign
s.counttokens();
string pathname = ftpclient.pwd();
while (s.hasmoreelements()) {
pathname = pathname "/" (string) s.nextelement();
try {
ftpclient.sendserver("mkd " pathname "\r\n");
} catch (exception e) {
e = null;
return false;
}
ftpclient.readserverresponse();
}
ftpclient.binary();
return true;
} catch (ioexception e1) {
e1.printstacktrace();
return false;
}
}
/**
* ftp上傳 如果伺服器段已存在名為filename的文件夾,該文件夾中與要上傳的文件夾中同名的文件將被替換
*
* @param filename
* 要上傳的文件(或文件夾)名
* @return
* @throws exception
*/
public boolean upload(string filename) {
string newname = "";
if (filename.indexof("/") > -1) {
newname = filename.substring(filename.lastindexof("/") 1);
} else {
newname = filename;
}
return upload(filename, newname);
}
/**
* ftp上傳 如果伺服器段已存在名為newname的文件夾,該文件夾中與要上傳的文件夾中同名的文件將被替換
*
* @param filename
* 要上傳的文件(或文件夾)名
* @param newname
* 伺服器段要生成的文件(或文件夾)名
* @return
*/
public boolean upload(string filename, string newname) {
try {
string savefilename = new string(filename.getbytes("gbk"),
"gbk");
file file_in = new file(savefilename);// 打開本地待長傳的文件
if (!file_in.exists()) {
throw new exception("此文件或文件夾[" file_in.getname() "]有誤或不存在!");
}
if (file_in.isdirectory()) {
upload(file_in.getpath(), newname, ftpclient.pwd());
} else {
uploadfile(file_in.getpath(), newname);
}
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
return true;
} catch (exception e) {
e.printstacktrace();
system.err.println("exception e in ftp upload(): " e.tostring());
return false;
} finally {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
} catch (ioexception e) {
e.printstacktrace();
}
}
}
/**
* 真正用於上傳的方法
*
* @param filename
* @param newname
* @param path
* @throws exception
*/
private void upload(string filename, string newname, string path)
throws exception {
string savefilename = new string(filename.getbytes("iso-8859-1"), "gbk");
file file_in = new file(savefilename);// 打開本地待長傳的文件
if (!file_in.exists()) {
throw new exception("此文件或文件夾[" file_in.getname() "]有誤或不存在!");
}
if (file_in.isdirectory()) {
if (!isdirexist(newname)) {
createdir(newname);
}
ftpclient.cd(newname);
file sourcefile[] = file_in.listfiles();
for (int i = 0; i < sourcefile.length; i ) {
if (!sourcefile[i].exists()) {
continue;
}
if (sourcefile[i].isdirectory()) {
this.upload(sourcefile[i].getpath(), sourcefile[i]
.getname(), path "/" newname);
} else {
this.uploadfile(sourcefile[i].getpath(), sourcefile[i]
.getname());
}
}
} else {
uploadfile(file_in.getpath(), newname);
}
ftpclient.cd(path);
}
/**
* upload 上傳文件
*
* @param filename
* 要上傳的文件名
* @param newname
* 上傳後的新文件名
* @return -1 文件不存在 >=0 成功上傳,返迴文件的大小
* @throws exception
*/
public long uploadfile(string filename, string newname) throws exception {
long result = 0;
telnetoutputstream os = null;
fileinputstream is = null;
try {
java.io.file file_in = new java.io.file(filename);
if (!file_in.exists())
return -1;
os = ftpclient.put(newname);
result = file_in.length();
is = new fileinputstream(file_in);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
}
} finally {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
}
return result;
}
/**
* 從ftp下載文件到本地
*
* @param filename
* 伺服器上的文件名
* @param newfilename
* 本地生成的文件名
* @return
* @throws exception
*/
public long downloadfile(string filename, string newfilename) {
long result = 0;
telnetinputstream is = null;
fileoutputstream os = null;
try {
is = ftpclient.get(filename);
java.io.file outfile = new java.io.file(newfilename);
os = new fileoutputstream(outfile);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
result = result c;
}
} catch (ioexception e) {
e.printstacktrace();
} finally {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
} catch (ioexception e) {
e.printstacktrace();
}
}
return result;
}
/**
* 取得相對於當前連接目錄的某個目錄下所有文件列表
*
* @param path
* @return
*/
public list getfilelist(string path) {
list list = new arraylist();
datainputstream dis;
try {
dis = new datainputstream(ftpclient.namelist(this.path path));
string filename = "";
while ((filename = dis.readline()) != null) {
list.add(filename);
}
} catch (ioexception e) {
e.printstacktrace();
}
return list;
}
public static void main(string[] args) {
ftputil ftp = new ftputil("192.168.11.11", "111", "1111");
ftp.connectserver();
boolean result = ftp.upload("c:/documents and settings/ipanel/桌面/java/hibernate_hql.docx", "amuse/audiotest/music/hibernate_hql.docx");
system.out.println(result ? "上傳成功!" : "上傳失敗!");
ftp.closeserver();
/**
* ftp遠程命令列表 user port retr allo dele site xmkd cdup feat pass pasv stor
* rest cwd stat rmd xcup opts acct type appe rnfr xcwd help xrmd stou
* auth rein stru smnt rnto list noop pwd size pbsz quit mode syst abor
* nlst mkd xpwd mdtm prot
* 在伺服器上執行命令,如果用sendserver來執行遠程命令(不能執行本地ftp命令)的話,所有ftp命令都要加上\r\n
* ftpclient.sendserver("xmkd /test/bb\r\n"); //執行伺服器上的ftp命令
* ftpclient.readserverresponse一定要在sendserver後調用
* namelist("/test")獲取指目錄下的文件列表 xmkd建立目錄,當目錄存在的情況下再次創建目錄時報錯 xrmd刪除目錄
* dele刪除文件
*/
}
}
ⅶ java 有什麼命令能夠判斷ftp服務的連接方式是主動連接還是被動連接
一.ftp的port(主動模式)和pasv(被動模式)
1. port(主動模式)
port中文稱為主動模式,工作的原理: ftp客戶端連接到ftp伺服器的21埠,發送用戶名和密碼登錄,登錄成功後要list列表或者讀取數據時,客戶端隨機開放一個埠(1024以上),發送 port命令到ftp伺服器,告訴伺服器客戶端採用主動模式並開放埠;ftp伺服器收到port主動模式命令和埠號後,通過伺服器的20埠和客戶端開放的埠連接,發送數據.
2. pasv(被動模式)
pasv是passive的縮寫,中文成為被動模式,工作原理:ftp客戶端連接到ftp伺服器的21埠,發送用戶名和密碼登錄,登錄成功後要list列表或者讀取數據時,發送pasv命令到ftp伺服器, 伺服器在本地隨機開放一個埠(1024以上),然後把開放的埠告訴客戶端, 客戶端再連接到伺服器開放的埠進行數據傳輸。
二.兩種模式的比較
從上面的運行原來看到,主動模式和被動模式的不同簡單概述為: 主動模式傳送數據時是「伺服器」連接到「客戶端」的埠;被動模式傳送數據是「客戶端」連接到「伺服器」的埠。
主動模式需要客戶端必須開放埠給伺服器,很多客戶端廳源陵都是在防火牆內,開放埠給ftp伺服器訪問比較困難。
被動模式只需要伺服器端開放埠給客戶端連接就行了。
三.不同工作模式的網路設置
實際項目中碰到的問題是,ftp的客戶端和伺服器分別在不同網路,兩個網路之間有至少4層的防火牆,伺服器端只開放了21埠, 客戶端機器沒開放任何埠。ftp客戶端連接採用的被動模式,結果客戶端能登錄成功,但是無法list列表和讀取數據。很明顯,是因為伺服器端沒開放被動模式下的隨機埠導致。
由於被動模式下,伺服器端開放的埠隨機,扮戚但是防火牆要不能全部開放,解決的方案是,在ftp伺服器配置被動模裂脊式下開放隨機埠在 50000-60000之間(范圍在ftp伺服器軟體設置,可以設置任意1024上的埠段),然後在防火牆設置規則,開放伺服器端50000-60000之間的埠端。
主動模式下,客戶端的ftp軟體設置主動模式開放的埠段,在客戶端的防火牆開放對應的埠段。
四.如何設置 工作模式
實時上ftp伺服器一般都支持主動和被動模式,連接採用何種模式是有ftp客戶端軟體決定。
ⅷ 使用java通過ftp下載文件,ftpclient.listfiles獲取不到當前路徑下的文件
file dir=new file(".");//當前路徑是項目文件夾,是src外面而不是裡面
file[]files=dir.listfiles(new filefilter(){
@override
public boolean accept(file arg0) {
return arg0.isfile();
}
});
system.out.println("有文件" files.length "個");