JAVA中使用FTPClient上传下载

http://blog.csdn.net/hbcui1984/archive/2008/07/27/2720204.aspx

在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件、下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件。

一、上传文件
  /**
   * 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;
  }


下面我们写两个小例子:

1.将本地文件上传到FTP服务器上,代码如下:
  @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();
    }
  }


2.在FTP服务器上生成一个文件,并将一个字符串写入到该文件中
  @Test
  public void testUpLoadFromString() {
    try {
      InputStream input = new ByteArrayInputStream("test ftp".getBytes("utf-8"));
      boolean flag = uploadFile("127.0.0.1", 21, "test", "test", "D:/ftp", "test.txt", input);
      System.out.println(flag);
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
  }


二、下载文件
从FTP服务器下载文件的代码也很简单,参考如下:
 /**
   * Description: 从FTP服务器下载文件
   * 
   * @Version1.0 Jul 27, 2008 5:32:36 PM by 崔红保(cuihongbao@d-heaven.com)创建
   * @param url FTP服务器hostname
   * @param port FTP服务器端口
   * @param username FTP登录账号
   * @param password FTP登录密码
   * @param remotePath FTP服务器上的相对路径
   * @param fileName 要下载的文件名
   * @param localPath 下载后保存到本地的路径
   * @return
   */
  public static boolean downFile(String url, int port, String username, String password,
      String remotePath, String fileName, String localPath) {
    boolean success = false;
    FTPClient ftp = new FTPClient();
    try {
      int reply;
      ftp.connect(url, port);
      // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
      ftp.login(username, password);// 登录
      reply = ftp.getReplyCode();
      if (!FTPReply.isPositiveCompletion(reply)) {
        ftp.disconnect();
        return success;
      }
      ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
      FTPFile[] fs = ftp.listFiles();
      for (FTPFile ff : fs) {
        if (ff.getName().equals(fileName)) {
          File localFile = new File(localPath + "/" + ff.getName());
          OutputStream is = new FileOutputStream(localFile);
          ftp.retrieveFile(ff.getName(), is);
          is.close();
        }
      }
      ftp.logout();
      success = true;
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (ftp.isConnected()) {
        try {
          ftp.disconnect();
        } catch (IOException ioe) {}
      }
    }
    return success;
  }
快乐渡过每一天,减肥坚持每一天