首先导入包
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
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传送到远程计算机。
案例:
public FTPClient ftp = new FTPClient(); // 实例化ftp客户端对象。
/*******************登陆***********************/
// 开始读取 就去连接FTP服务器
if (ftp.isConnected() == false)
{
try
{
ftp.connect(host_ip);// 连接 Ftp host_ip FTP服务器ip
try
{
ftp.login(username, password);// 登陆 login ()方法登陆ftp
ftp.setFileType(FTPClient.ASCII_FILE_TYPE);// 设置文件类型setFileType()设置ftp文件类型
} catch (Exception e1)
{
log.error("faile to load!!!!");
}
} catch (SocketException e1)
{
log.error("建立连接FTP连接失败");
} catch (IOException e1)
{
log.error("IO异常FTP.txt读取失败");
}
}
/**************下载文件***************************/
public void downloadFiles()
{
// 进入FTP服务器工作目录
ftp.changeWorkingDirectory(ftp.printWorkingDirectory()+ remote_dir); // remote_dir FTP远程文件目录
// 获得远程ftp目录下的文件列表
FTPFile[] fileList = ftp.listFiles("."); // . 号可替换成文件指定ftp目录。获取FTPfile文件列表。注意:文件列表包含文件夹及文件
String[] files = ftp.listNames(); // 获取FTP服务器文件名称列表。注意:文件列表包含文件夹及文件的名称。
/*
fileList[0].getGroup(); // 文件所属组 ,对应有set
fileList[0].getName(); // 文件名称, setName("")重命名
fileList[0].getSize(); // 文件大小 返回long数据类型
fileList[0].getTimestamp().getTime(); //文件最后修改时间
fileList[0].getType(); //文件类型
fileList[0].getUser(); //文件所属用户
fileList[0].isDirectory(); // 文件是不是文件夹
fileList[0].isFile(); //判断是不是 文件
fileList[0].isSymbolicLink(); // ???
fileList[0].isUnknown(); // ?、、
fileList[0].DIRECTORY_TYPE; //属性,文件夹类型 返回int型
fileList[0].FILE_TYPE; // 属性, 文件类型, 返回int型
fileList[0].GROUP_ACCESS; //组, 返回int型
*/
//下载指定文件的时候,要判断指定文件的名称,比如下载,AA.TXT文件
//遍历获取的FTP文件名称列表
for(int i ; i < fileList.length (标注: 或者files.length ); i ++ )
{
//判断文件名是否包含AA.txt的。注意:在 linux里 fileList 对象获取不到length属性。必须通过files属性获取。判断文件名称列表也必须从files数组中获取。
if(fileList[i].getName().indexOf("AA.txt") != -1)
{
File localfile = new File(local_dir+"/"+fileList[i].getName());
OutPutStream ops = FileOutputStream(localFile);
ftp.retrieveFile(fileList[i].getName(), ops); //将FTP上指定文件名称的文件,下载到本地指定输出流的文件夹中。
ops.close();
}
}
}
/******************上传指定文件***********************/
/**
* Description: 向FTP服务器上传文件
* @Version1.0 Jul 27, 2008 4:31:09 PM by 崔红保(cuihongbao@d-heaven.com)创建
* @param url FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param path FTP服务器保存目录
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
*/
public static boolean uploadFile(String url,int port,String username, String password, String path, String filename, InputStream input) {
boolean success = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(url, port);//连接FTP服务器
//如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(username, password);//登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
ftp.changeWorkingDirectory(path);
ftp.storeFile(filename, input);
input.close();
ftp.logout();
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
@Test
public void testUpLoadFromDisk(){
try {
FileInputStream in=new FileInputStream(new File("D:/test.txt"));
boolean flag = uploadFile("127.0.0.1", 21, "test", "test", "D:/ftp", "test.txt", in);
System.out.println(flag);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
上传部分来自CSDN博客,转载请标明出处:http://blog.csdn.net/hbcui1984/archive/2008/07/27/2720204.aspx#