详解JAVA中使用FTPClient工具类上传下载

详解JAVA中使用FTPClient工具类上传下载

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

1、写一个javabean文件,描述ftp上传或下载的信息

实例代码:

public class FtpUseBean {
  private String host;
  private Integer port;
  private String userName;
  private String password;
  private String ftpSeperator;
  private String ftpPath="";
  private int repeatTime = 0;//连接ftp服务器的次数 

  public String getHost() {
    return host;
  } 

  public void setHost(String host) {
    this.host = host;
  } 

  public Integer getPort() {
    return port;
  }
  public void setPort(Integer port) {
    this.port = port;
  } 

  public String getUserName() {
    return userName;
  } 

  public void setUserName(String userName) {
    this.userName = userName;
  } 

  public String getPassword() {
    return password;
  } 

  public void setPassword(String password) {
    this.password = password;
  } 

  public void setFtpSeperator(String ftpSeperator) {
    this.ftpSeperator = ftpSeperator;
  } 

  public String getFtpSeperator() {
    return ftpSeperator;
  } 

  public void setFtpPath(String ftpPath) {
    if(ftpPath!=null)
      this.ftpPath = ftpPath;
  } 

  public String getFtpPath() {
    return ftpPath;
  } 

  public void setRepeatTime(int repeatTime) {
    if (repeatTime > 0)
      this.repeatTime = repeatTime;
  } 

  public int getRepeatTime() {
    return repeatTime;
  } 

  /**
   * take an example:<br>
   * ftp://userName:password@ip:port/ftpPath/
   * @return
   */
  public String getFTPURL() {
    StringBuffer buf = new StringBuffer();
    buf.append("ftp://");
    buf.append(getUserName());
    buf.append(":");
    buf.append(getPassword());
    buf.append("@");
    buf.append(getHost());
    buf.append(":");
    buf.append(getPort());
    buf.append("/");
    buf.append(getFtpPath()); 

    return buf.toString();
  }
}

2、导入包commons-net-1.4.1.jar 

package com.util; 

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.SocketException;
import java.net.URL;
import java.net.URLConnection; 

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile; 

import com.bean.FtpUseBean; 

public class FtpUtil extends FTPClient { 

  private static Log log = LogFactory.getLog(FtpUtil.class);
  private FtpUseBean ftpUseBean;
  //获取目标路径下的文件属性信息,主要是获取文件的size
  private FTPFile[] files; 

  public FtpUseBean getFtpUseBean() {
    return ftpUseBean;
  } 

  public FtpUtil(){
    super();
  } 

  public void setFtpUseBean(FtpUseBean ftpUseBean) {
    this.ftpUseBean = ftpUseBean;
  } 

  public boolean ftpLogin() {
    boolean isLogined = false;
    try {
      log.debug("ftp login start ...");
      int repeatTime = ftpUseBean.getRepeatTime();
      for (int i = 0; i < repeatTime; i++) {
        super.connect(ftpUseBean.getHost(), ftpUseBean.getPort());
        isLogined = super.login(ftpUseBean.getUserName(), ftpUseBean.getPassword());
        if (isLogined)
          break;
      }
      if(isLogined)
        log.debug("ftp login successfully ...");
      else
        log.debug("ftp login failed ...");
      return isLogined;
    } catch (SocketException e) {
      log.error("", e);
      return false;
    } catch (IOException e) {
      log.error("", e);
      return false;
    } catch (RuntimeException e) {
      log.error("", e);
      return false;
    }
  } 

  public void setFtpToUtf8() throws IOException { 

    FTPClientConfig conf = new FTPClientConfig();
    super.configure(conf);
    super.setFileType(FTP.IMAGE_FILE_TYPE);
    int reply = super.sendCommand("OPTS UTF8 ON");
    if (reply == 200) { // UTF8 Command
      super.setControlEncoding("UTF-8");
    } 

  } 

  public void close() {
    if (super.isConnected()) {
      try {
        super.logout();
        super.disconnect();
        log.debug("ftp logout ....");
      } catch (Exception e) {
        log.error(e.getMessage());
        throw new RuntimeException(e.toString());
      }
    }
  } 

  public void uploadFileToFtpByIS(InputStream inputStream, String fileName) throws IOException {
    super.storeFile(ftpUseBean.getFtpPath()+fileName, inputStream);
  } 

  public File downFtpFile(String fileName, String localFileName) throws IOException {
    File outfile = new File(localFileName);
    OutputStream oStream = null;
    try {
      oStream = new FileOutputStream(outfile);
      super.retrieveFile(ftpUseBean.getFtpPath()+fileName, oStream);
      return outfile;
    } finally {
      if (oStream != null)
        oStream.close();
    }
  } 

  public FTPFile[] listFtpFiles() throws IOException {
    return super.listFiles(ftpUseBean.getFtpPath());
  } 

  public void deleteFtpFiles(FTPFile[] ftpFiles) throws IOException {
    String path = ftpUseBean.getFtpPath();
    for (FTPFile ff : ftpFiles) {
      if (ff.isFile()) {
        if (!super.deleteFile(path + ff.getName()))
          throw new RuntimeException("delete File" + ff.getName() + " is n't seccess");
      }
    }
  } 

  public void deleteFtpFile(String fileName) throws IOException {
    if (!super.deleteFile(ftpUseBean.getFtpPath() +fileName))
      throw new RuntimeException("delete File" + ftpUseBean.getFtpPath() +fileName + " is n't seccess");
  } 

  public InputStream downFtpFile(String fileName) throws IOException {
    return super.retrieveFileStream(ftpUseBean.getFtpPath()+fileName);
  } 

  /**
   *
   * @return
   * @return StringBuffer
   * @description 下载ftp服务器上的文件,addr为带用户名和密码的URL
   */
  public StringBuffer downloadBufferByURL(String addr) {
    BufferedReader in = null;
    try {
      URL url = new URL(addr);
      URLConnection conn = url.openConnection();
      in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
      String line;
      StringBuffer ret = new StringBuffer();
      while ((line = in.readLine()) != null)
        ret.append(line); 

      return ret;
    } catch (Exception e) {
      log.error(e);
      return null;
    } finally {
      try {
        if (null != in)
          in.close();
      } catch (IOException e) {
        e.printStackTrace();
        log.error(e);
      }
    }
  } 

  /**
   *
   * @return
   * @return byte[]
   * @description 下载ftp服务器上的文件,addr为带用户名和密码的URL
   */
  public byte[] downloadByteByURL(String addr) { 

    FTPClient ftp = null; 

    try { 

      URL url = new URL(addr); 

      int port = url.getPort()!=-1?url.getPort():21;
      log.info("HOST:"+url.getHost());
      log.info("Port:"+port);
      log.info("USERINFO:"+url.getUserInfo());
      log.info("PATH:"+url.getPath()); 

      ftp = new FTPClient(); 

      ftp.setDataTimeout(30000);
      ftp.setDefaultTimeout(30000);
      ftp.setReaderThread(false);
      ftp.connect(url.getHost(), port);
      ftp.login(url.getUserInfo().split(":")[0], url.getUserInfo().split(":")[1]);
      FTPClientConfig conf = new FTPClientConfig("UNIX");
           ftp.configure(conf);
      log.info(ftp.getReplyString()); 

      ftp.enterLocalPassiveMode(); //ftp.enterRemotePassiveMode()
      ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);  

      int reply = ftp.sendCommand("OPTS UTF8 ON");// try to 

      log.debug("alter to utf-8 encoding - reply:" + reply);
      if (reply == 200) { // UTF8 Command
        ftp.setControlEncoding("UTF-8");
      }
      ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 

      log.info(ftp.getReplyString()); 

      ByteArrayOutputStream out=new ByteArrayOutputStream();
           DataOutputStream o=new DataOutputStream(out);
           String remotePath = url.getPath();
           /**
           * Fixed:if doen't remove the first "/" at the head of url,
            * the file can't be retrieved.
           */
           if(remotePath.indexOf("/")==0) {
             remotePath = url.getPath().replaceFirst("/", "");
           }
           ftp.retrieveFile(remotePath, o);
      byte[] ret = out.toByteArray();
      o.close(); 

      String filepath = url.getPath();
      ftp.changeWorkingDirectory(filepath.substring(0,filepath.lastIndexOf("/")));
      files = ftp.listFiles(); 

      return ret;
        } catch (Exception ex) {
      log.error("Failed to download file from ["+addr+"]!"+ex);
       } finally {
      try {
        if (null!=ftp)
          ftp.disconnect();
      } catch (Exception e) {
        //
      }
    }
    return null;
//   StringBuffer buffer = downloadBufferByURL(addr);
//   return null == buffer ? null : buffer.toString().getBytes();
  } 

  public FTPFile[] getFiles() {
    return files;
  } 

  public void setFiles(FTPFile[] files) {
    this.files = files;
  } 

// public static void getftpfilesize(String addr){
//
//   FTPClient ftp = null;
//
//   try {
//
//     URL url = new URL(addr);
//
//     int port = url.getPort()!=-1?url.getPort():21;
//     log.info("HOST:"+url.getHost());
//     log.info("Port:"+port);
//     log.info("USERINFO:"+url.getUserInfo());
//     log.info("PATH:"+url.getPath());
//
//     ftp = new FTPClient();
//
//     ftp.setDataTimeout(30000);
//     ftp.setDefaultTimeout(30000);
//     ftp.setReaderThread(false);
//     ftp.connect(url.getHost(), port);
//     ftp.login(url.getUserInfo().split(":")[0], url.getUserInfo().split(":")[1]);
//     FTPClientConfig conf = new FTPClientConfig("UNIX");
//     ftp.configure(conf);
//     log.info(ftp.getReplyString());
//
//     ftp.enterLocalPassiveMode(); //ftp.enterRemotePassiveMode()
//     ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE);
//
//     int reply = ftp.sendCommand("OPTS UTF8 ON");// try to
//
//     log.debug("alter to utf-8 encoding - reply:" + reply);
//     if (reply == 200) { // UTF8 Command
//       ftp.setControlEncoding("UTF-8");
//     }
//     ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
//     ftp.changeWorkingDirectory(url.getPath());
//     FTPFile[] files = ftp.listFiles();
//     for (FTPFile flie : files){
//       System.out.println(new String(flie.getName().getBytes("gbk"),"ISO8859-1"));
//       System.out.println(flie.getSize());
//     }
//
//
//   } catch (Exception ex) {
//     log.error("Failed to download file from ["+addr+"]!"+ex);
//   } finally {
//     try {<pre class="java" name="code">     if (null!=ftp)
//     ftp.disconnect();
 //     } catch (Exception e) {
}
}
}
}

以上就是JAVA FTPClient工具类的上传和下载的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2017-07-30

Java使用FTPClient类读写FTP

本文实例为大家分享了Java使用FTPClient类读写FTP的具体代码,供大家参考,具体内容如下 1.首先先导入相关jar包 2.创建一个连接FTP的工具类FTPUtil.java package com.metarnet.ftp.util; import java.io.IOException; import java.io.InputStream; import java.net.SocketException; import java.util.Properties; import or

Java FTPClient实现文件上传下载

在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 所用到的jar包有:  commons-net-1.4.1.jar  jakarta-oro.jar  一.上传文件 文件上传源代码 /** * Description: 向FTP服务器上传文件 * @Version1.0 * @param url FTP服务器hostname * @param

Java中FTPClient上传中文目录、中文文件名乱码问题解决方法

问题描述: 使用org.apache.commons.net.ftp.FTPClient创建中文目录.上传中文文件名时,目录名及文件名中的中文显示为"??". 原因: FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码. 解决方案: 1.将中文的目录或文件名转为iso-8859-1编码的字符.参考代码: 复制代码 代码如下: String name="目录名或文件名"; name=new String(name.getBytes(&qu

JAVA中使用FTPClient实现文件上传下载实例代码

在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 F

Java FtpClient 实现文件上传服务

一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /bin/bash uftp 3.设置用户密码 sudo useradd -d /home/uftp -s /bin/bash uftp 4.创建用户目录 sudo mkdir /home/uftp 5.设置用户密码 sudo passwd uftp 6.设置/etc/vsftpd.conf配置文件 s

java实现FTP文件上传与文件下载

本文实例为大家分享了两种java实现FTP文件上传下载的方式,供大家参考,具体内容如下 第一种方式: package com.cloudpower.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import sun.net.TelnetInputStream; import sun.net.TelnetO

java实现将文件上传到ftp服务器的方法

本文实例讲述了java实现将文件上传到ftp服务器的方法.分享给大家供大家参考,具体如下: 工具类: package com.fz.common.util; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; imp

Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题

废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String path,String filename,InputStream input) { boolean success=false; FTPClient ftp=new FTPClient();//org.apache.commons.net.ftp

java实现ftp文件上传下载功能

本文实例为大家分享了ftp实现文件上传下载的具体代码,供大家参考,具体内容如下 package getUrlPic; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org

Spring Boot搭建文件上传服务的方法

本文实例为大家分享了Spring Boot搭建文件上传服务的具体代码,供大家参考,具体内容如下 一.服务端 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http:/

Java中实现文件上传下载的三种解决方案(推荐)

java文件上传与文件下载是程序开发中比较常见的功能,下面通过本文给大家介绍Java中实现文件上传下载的三种解决方案,具体详情如下所示: 第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null; String fileAddre="/numUp"; try { InputStream stream = file.getInputStream(

Java实现的文件上传下载工具类完整实例【上传文件自动命名】

本文实例讲述了Java实现的文件上传下载工具类.分享给大家供大家参考,具体如下: 这是一个在Eclipse环境下采用Java语言实现文件上传下载的工具类.和之前介绍的C#文件上传下载工具类一样,在上传时,为避免文件名在服务器中重复,采用"服务器时间(定义到毫秒)+文件名+文件后缀"的方式作为服务器上的文件名:下载过程中利用 spring mvc ResponseEntity 做文件下载,返回的是字节流,下载成功后可自定义文件的保存路径. 具体源码如下所示: package com.ut