FTP实现上传下载文件详解

首先导入包

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();
  }
 }

 案例一:

 用apache FTP client实现FTP客户端--支持断点续传和中文文件

利用org.apache.commons.net.ftp包实现一个简单的ftp客户端实用类。主要实现一下功能

1.支持上传下载。支持断点续传

2.支持进度汇报

3.支持对于中文目录及中文文件创建的支持。 

枚举类UploadStatus代码

 

[java]  view plain copy
  1.  1public enum UploadStatus {       
  2.  2.     Create_Directory_Fail,      //远程服务器相应目录创建失败       
  3.  3.     Create_Directory_Success,   //远程服务器闯将目录成功       
  4.  4.     Upload_New_File_Success,    //上传新文件成功       
  5.  5.     Upload_New_File_Failed,     //上传新文件失败       
  6.  6.     File_Exits,                 //文件已经存在       
  7.  7.     Remote_Bigger_Local,        //远程文件大于本地文件       
  8.  8.     Upload_From_Break_Success,  //断点续传成功       
  9.  9.     Upload_From_Break_Failed,   //断点续传失败       
  10. 10.     Delete_Remote_Faild;        //删除远程文件失败       
  11. 11. }    

 

 

枚举类DownloadStatus代码

 

[c-sharp]  view plain copy
  1. 1. public enum DownloadStatus {       
  2. 2.     Remote_File_Noexist,    //远程文件不存在       
  3. 3.     Local_Bigger_Remote,    //本地文件大于远程文件       
  4. 4.     Download_From_Break_Success,    //断点下载文件成功       
  5. 5.     Download_From_Break_Failed,     //断点下载文件失败       
  6. 6.     Download_New_Success,           //全新下载文件成功       
  7. 7.     Download_New_Failed;            //全新下载文件失败       
  8. 8. }    

 

 

 

 

核心FTP代码

 

[c-sharp]  view plain copy
  1. 核心FTP代码  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.io.OutputStream;  
  8. import java.io.PrintWriter;  
  9. import java.io.RandomAccessFile;  
  10.   
  11. import open.mis.data.DownloadStatus;  
  12. import open.mis.data.UploadStatus;  
  13.   
  14. import org.apache.commons.net.PrintCommandListener;  
  15. import org.apache.commons.net.ftp.FTP;  
  16. import org.apache.commons.net.ftp.FTPClient;  
  17. import org.apache.commons.net.ftp.FTPFile;  
  18. import org.apache.commons.net.ftp.FTPReply;  
  19.   
  20. /** 
  21. * 支持断点续传的FTP实用类 
  22. * @author BenZhou 
  23. * @version 0.1 实现基本断点上传下载 
  24. * @version 0.2 实现上传下载进度汇报 
  25. * @version 0.3 实现中文目录创建及中文文件创建,添加对于中文的支持 
  26. */  
  27. public class ContinueFTP {  
  28. public FTPClient ftpClient = new FTPClient();  
  29.   
  30. public ContinueFTP(){  
  31.    //设置将过程中使用到的命令输出到控制台  
  32.    this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));  
  33. }  
  34.   
  35. /** 
  36. * 连接到FTP服务器 
  37. * @param hostname 主机名 
  38. * @param port 端口 
  39. * @param username 用户名 
  40. * @param password 密码 
  41. * @return 是否连接成功 
  42. * @throws IOException 
  43. */  
  44. public boolean connect(String hostname,int port,String username,String password) throws IOException{  
  45.    ftpClient.connect(hostname, port);  
  46.    ftpClient.setControlEncoding("GBK");  
  47.    if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){  
  48.     if(ftpClient.login(username, password)){  
  49.      return true;  
  50.     }  
  51.    }  
  52.    disconnect();  
  53.    return false;  
  54. }  
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值