详解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工具类的上传和下载的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • 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包中)实现上传下载文件. 一.上传文件 原理就不介绍了,大家直接看代码吧 /** * Description: 向FTP服务器上传文件 * @Version1.0 Jul 27, 2008 4:31:09 PM by 崔红保(cuihongbao@d-heaven.com)创建 * @param url F

  • 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 实现文件上传服务

    一.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中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中使用FTPClient工具类上传下载 在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件.本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 1.写一个javabean文件,描述ftp上传或下载的信息 实例代码: public class FtpUseBean { private String host; private Integer port; private String us

  • 详解Java中的File文件类以及FileDescriptor文件描述类

    File File 是"文件"和"目录路径名"的抽象表示形式. File 直接继承于Object,实现了Serializable接口和Comparable接口.实现Serializable接口,意味着File对象支持序列化操作.而实现Comparable接口,意味着File对象之间可以比较大小:File能直接被存储在有序集合(如TreeSet.TreeMap中). 1. 新建目录的常用方法 方法1:根据相对路径新建目录. 示例代码如下(在当前路径下新建目录"

  • 详解Java中字符串缓冲区StringBuffer类的使用

    StringBuffer 是一个线程安全的可变的字符序列.它继承于AbstractStringBuilder,实现了CharSequence接口. StringBuilder 也是继承于AbstractStringBuilder的子类:但是,StringBuilder和StringBuffer不同,前者是非线程安全的,后者是线程安全的. StringBuffer 和 CharSequence之间的关系图如下: StringBuffer类和String一样,也用来代表字符串,只是由于StringB

  • 基于Java文件输入输出流实现文件上传下载功能

    本文为大家分享了Java实现文件上传下载功能的具体代码,供大家参考,具体内容如下 前端通过form表单的enctype属性,将数据传递方式修改为二进制"流"的形式,服务端(servlet)通过  getInputStream() 获取流信息, 运用java I/O 流的基础操作将流写入到一个服务端临时创建的文件temp中,然后再次利用文件基本操作,读取并截取临时文件内容,根据其中信息创建相应的文件,将读取出来的具体信息写入,下载时,根据提交的文件名称,找到服务器端相应的文件,然后根据输

  • Java 中DateUtils日期工具类的实例详解

    Java 中DateUtils日期工具类的实例详解 介绍 在java中队日期类型的处理并不方便,通常都需要借助java.text.SimpleDateFormat类来实现日期类型 和字符串类型之间的转换,但是在jdk1.8之后有所改善,jdk1.7以及之前的版本处理日期类型并不方便, 可以借助Joda Time组件来处理,尤其是日期类型的一些数学操作就更是不方便. java代码 /** * * 日期工具类 java对日期的操作一直都很不理想,直到jdk1.8之后才有了本质的改变. * 如果使用的

  • 详解Java中CountDownLatch异步转同步工具类

    使用场景 由于公司业务需求,需要对接socket.MQTT等消息队列. 众所周知 socket 是双向通信,socket的回复是人为定义的,客户端推送消息给服务端,服务端的回复是两条线.无法像http请求有回复. 下发指令给硬件时,需要校验此次数据下发是否成功. 用户体验而言,点击按钮就要知道此次的下发成功或失败. 如上图模型, 第一种方案使用Tread.sleep 优点:占用资源小,放弃当前cpu资源 缺点: 回复速度快,休眠时间过长,仍然需要等待休眠结束才能返回,响应速度是固定的,无法及时响

  • Java中Arrays数组工具类的基本使用详解

    目录 方法一览表 快速定位详细操作 asList() toString() 和 deepToString() sort() 和 parallelSort() binarySearch() compare() 和 compareUnsigned() copyOf() 和 copyOfRange() equals() deepEquals() 比较equals()和deepEquals()方法  fill() mismatch() parallelPrefix() setAll() 和 parall

  • 详解Java 中的嵌套类与内部类

    详解Java 中的嵌套类与内部类 在Java中,可以在一个类内部定义另一个类,这种类称为嵌套类(nested class).嵌套类有两种类型:静态嵌套类和非静态嵌套类.静态嵌套类较少使用,非静态嵌套类使用较多,也就是常说的内部类.其中内部类又分为三种类型: 1.在外部类中直接定义的内部类. 2.在函数中定义的内部类. 3.匿名内部类. 对于这几种类型的访问规则, 示例程序如下: package lxg; //定义外部类 public class OuterClass { //外部类静态成员变量

  • 详解Java中的日期类

    Java 编程语言中时间的处理类有 Date类与 Calendar类.目前官方不推荐使用 Date类,因为其不利于国际化:而是推荐使用 Calendar类,并使用 DateFormat 类做格式化处理. 一.Date 类介绍 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值.它也允许格式化和解析日期字符串. 不过,这些函数的 API 不易于实现国际化.从 JDK 1.1 开始,应该使用 Calenda

随机推荐