昨天用JAVA寫了一個實現(xiàn)FTP文件上傳功能的類(是通過sun.net.ftp包實現(xiàn)的,此包為SUN的私有類包,所以官方?jīng)]有提供相關(guān)API文檔),然后進行了簡單的測試。
具體類代碼如下(此類的部分方法還未完善):
package com.tools;
import java.io.FileInputStream;
import java.io.IOException;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
import java.io.IOException;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
/**
* @author simplelife
* @version 1.0
*
*/
public class FtpTool{
private FtpClient ftp;
/**
* 構(gòu)造方法,新建一個FtpClient對象,并打開FTP服務(wù)器
* @param host FTP服務(wù)器地址;port FTP服務(wù)端口
*
*/
public FtpTool(String host,int port)throws IOException{
ftp = new FtpClient();
ftp.openServer(host, port);
}
/**
* 登陸方法,通過用戶名密碼登陸到指定的FTP服務(wù)器上去,并返回歡迎信息
* @param username FTP用戶名;password 密碼
*
*/
public String login(String username,String password)throws IOException{
this.ftp.login(username, password);
return this.ftp.welcomeMsg;
}
/**
* 此方法用來上傳文件。
* @param pathname 本地路徑;filename 要上傳的文件名稱
*
*/
public void upload(String pathname,String filename)throws IOException{
if(!this.ftp.serverIsOpen()){
System.out.println("服務(wù)器連接不可用!");
}
this.ftp.binary();
TelnetOutputStream os = null;
FileInputStream is = null;
try {
//用ftp上傳后的文件名與原文件名相同,同為filename變量內(nèi)容
os = this.ftp.put(filename);
java.io.File file_in = new java.io.File(pathname+"\\"+filename);
if (file_in.length()==0) {
System.out.println("上傳文件為空!");
}
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();
}
}
System.out.println("上傳文件成功!");
this.ftp.ascii();
}
/**
* 此方法用來下載文件。
* @param pathname 本地路徑;filename 要上傳的文件名稱
*
*/
public void download(String pathname,String filename)throws IOException{
}
public static void main(String[] args){
try{
FtpTool ftpt = new FtpTool("128.14.9.13",21);
String welstr = ftpt.login("xxxx", "xxxxxxxx");
System.out.println(welstr);
ftpt.upload("C:", "111.txt");
}catch(IOException ioe){
ioe.printStackTrace();
}
}
}
* @author simplelife
* @version 1.0
*
*/
public class FtpTool{
private FtpClient ftp;
/**
* 構(gòu)造方法,新建一個FtpClient對象,并打開FTP服務(wù)器
* @param host FTP服務(wù)器地址;port FTP服務(wù)端口
*
*/
public FtpTool(String host,int port)throws IOException{
ftp = new FtpClient();
ftp.openServer(host, port);
}
/**
* 登陸方法,通過用戶名密碼登陸到指定的FTP服務(wù)器上去,并返回歡迎信息
* @param username FTP用戶名;password 密碼
*
*/
public String login(String username,String password)throws IOException{
this.ftp.login(username, password);
return this.ftp.welcomeMsg;
}
/**
* 此方法用來上傳文件。
* @param pathname 本地路徑;filename 要上傳的文件名稱
*
*/
public void upload(String pathname,String filename)throws IOException{
if(!this.ftp.serverIsOpen()){
System.out.println("服務(wù)器連接不可用!");
}
this.ftp.binary();
TelnetOutputStream os = null;
FileInputStream is = null;
try {
//用ftp上傳后的文件名與原文件名相同,同為filename變量內(nèi)容
os = this.ftp.put(filename);
java.io.File file_in = new java.io.File(pathname+"\\"+filename);
if (file_in.length()==0) {
System.out.println("上傳文件為空!");
}
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();
}
}
System.out.println("上傳文件成功!");
this.ftp.ascii();
}
/**
* 此方法用來下載文件。
* @param pathname 本地路徑;filename 要上傳的文件名稱
*
*/
public void download(String pathname,String filename)throws IOException{
}
public static void main(String[] args){
try{
FtpTool ftpt = new FtpTool("128.14.9.13",21);
String welstr = ftpt.login("xxxx", "xxxxxxxx");
System.out.println(welstr);
ftpt.upload("C:", "111.txt");
}catch(IOException ioe){
ioe.printStackTrace();
}
}
}
在測試過程中拋出一個異常,具體信息如下:
User at logged in.
sun.net.ftp.FtpProtocolException: STOR 111.txt:425 Can't build data connection: Connection timed out.
at sun.net.ftp.FtpClient.openDataConnection(Unknown Source)
at sun.net.ftp.FtpClient.put(Unknown Source)
at com.tools.FtpTool.upload(FtpTool.java:56)
at com.tools.FtpTool.main(FtpTool.java:94)
at sun.net.ftp.FtpClient.put(Unknown Source)
at com.tools.FtpTool.upload(FtpTool.java:56)
at com.tools.FtpTool.main(FtpTool.java:94)
拋出此異常的具體表現(xiàn)為:在FTP服務(wù)器上已經(jīng)創(chuàng)建了該文件,但文件大小為0。在網(wǎng)上搜索相關(guān)異常描述也很少,經(jīng)過仔細分析發(fā)現(xiàn),此問題與FTP客戶端防火墻有關(guān)。然后我關(guān)閉防火墻軟件,再進行測試,一切OK!
在網(wǎng)上也發(fā)現(xiàn)另一個常見異常,我將它重現(xiàn)并做說明。其主要原因是很多FTP服務(wù)沒有使用默認端口,在代碼實現(xiàn)中,連接端口不正確所導致異常出現(xiàn)的。
sun.net.ftp.FtpProtocolException: Welcome message: ??$
at sun.net.ftp.FtpClient.openServer(Unknown Source)
at com.tools.FtpTool.<init>(FtpTool.java:29)
at com.tools.FtpTool.main(FtpTool.java:91)
at sun.net.ftp.FtpClient.openServer(Unknown Source)
at com.tools.FtpTool.<init>(FtpTool.java:29)
at com.tools.FtpTool.main(FtpTool.java:91)
第三種異常就是由于FTP服務(wù)器端的FTP服務(wù)沒有開啟,連接被拒絕所導致的。具體異常如下:
java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
最后,如果大家遇到什么新的相關(guān)問題,可以在這里留言,我們來共同解決問題、學習提高。