java基于Apache FTP实现文件上传、下载、修改文件名、删除_java

Apache FTP 是应用比较广泛的FTP上传客户端工具,它易于操作,代码简略,结构清晰,是做FTP文件客户端管理软件的优先之选。FTP的操作包括:FTP文件上传(断点续传)、FTP文件下载、FTP文件重命名、FTP文件删除,这些操作已经将FTP应用管理的方式发挥的淋漓尽致了,So 我一直都用此种方式来实现FTP文件服务器的管理工作;下附FTP工具代码。

1、FTP文件操作状态枚举类

package com.scengine.wtms.utils.ftp; 

public enum FTPStatus
{
  File_Exits(0), Create_Directory_Success(1), Create_Directory_Fail(2), Upload_From_Break_Success(3), Upload_From_Break_Faild(4), Download_From_Break_Success(5), Download_From_Break_Faild(6), Upload_New_File_Success(7), Upload_New_File_Failed(8), Delete_Remote_Success(9), Delete_Remote_Faild(10),Remote_Bigger_Local(11),Remote_smaller_local(12),Not_Exist_File(13),Remote_Rename_Success(14),Remote_Rename_Faild(15),File_Not_Unique(16); 

  private int status; 

  public int getStatus()
  {
    return status;
  } 

  public void setStatus(int status)
  {
    this.status = status;
  } 

  FTPStatus(int status)
  {
    this.status = status;
  }
}

2、FTP文件操作工具代码

package com.scengine.wtms.utils.ftp; 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import com.scengine.wtms.utils.Log; 

public class FTPUtils
{
  private FTPClient ftpClient = new FTPClient(); 

  /**
   * 对象构造 设置将过程中使用到的命令输出到控制台
   */
  public FTPUtils()
  {
    this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
  } 

  /**
   *
   * java编程中用于连接到FTP服务器
   *
   * @param hostname
   *      主机名
   *
   * @param port
   *      端口
   *
   * @param username
   *      用户名
   *
   * @param password
   *      密码
   *
   * @return 是否连接成功
   *
   * @throws IOException
   */ 

  public boolean connect(String hostname, int port, String username, String password) throws IOException
  { 

    ftpClient.connect(hostname, port); 

    if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode()))
    { 

      if (ftpClient.login(username, password))
      {
        return true;
      }
    }
    disconnect();
    return false; 

  } 

  /**
   * 删除远程FTP文件
   *
   * @param remote
   *      远程文件路径
   * @return
   * @throws IOException
   */
  public FTPStatus delete(String remote) throws IOException
  {
    ftpClient.enterLocalPassiveMode(); 

    ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 

    FTPStatus result = null; 

    FTPFile[] files = ftpClient.listFiles(remote);
    if (files.length == 1)
    {
      boolean status = ftpClient.deleteFile(remote);
      result = status ? FTPStatus.Delete_Remote_Success : FTPStatus.Delete_Remote_Faild;
    }
    else
    {
      result = FTPStatus.Not_Exist_File;
    }
    Log.getLogger(this.getClass()).info("FTP服务器文件删除标识:"+result);
    return result;
  } 

  /**
   * 重命名远程FTP文件
   *
   * @param name
   *      新远程文件名称(路径-必须保证在同一路径下)
   *
   * @param remote
   *      远程文件路径
   *
   * @return 是否成功
   *
   * @throws IOException
   */
  public FTPStatus rename(String name,String remote) throws IOException
  {
    ftpClient.enterLocalPassiveMode(); 

    ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 

    FTPStatus result = null; 

    FTPFile[] files = ftpClient.listFiles(remote);
    if (files.length == 1)
    {
      boolean status = ftpClient.rename(remote, name);
      result = status ? FTPStatus.Remote_Rename_Success : FTPStatus.Remote_Rename_Faild;
    }
    else
    {
      result = FTPStatus.Not_Exist_File;
    }
    Log.getLogger(this.getClass()).info("FTP服务器文件名更新标识:"+result);
    return result;
  } 

  /**
   *
   * 从FTP服务器上下载文件
   *
   * @param fileName
   *      下载文件的名字(包括后缀名)
   *
   * @param remote
   *      远程文件路径
   *
   * @param local
   *      本地文件路径
   *
   * @return 是否成功
   *
   * @throws IOException
   */ 

  public FTPStatus download(String fileName,String remote,HttpServletResponse response) throws IOException
  {
    // 开启输出流弹出文件保存路径选择窗口
    response.setContentType("application/octet-stream"); 

    response.setContentType("application/OCTET-STREAM;charset=UTF-8"); 

    response.setHeader("Content-Disposition", "attachment;filename=" +fileName); 

    ftpClient.enterLocalPassiveMode(); 

    ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 

    FTPStatus result; 

    OutputStream out = response.getOutputStream(); 

    boolean status = ftpClient.retrieveFile(remote, out); 

    result=status?FTPStatus.Download_From_Break_Success:FTPStatus.Download_From_Break_Faild; 

    Log.getLogger(this.getClass()).info("FTP服务器文件下载标识:"+result); 

    out.close(); 

    return result;
  } 

  /**
   *
   * 从FTP服务器上下载文件
   *
   * @param remote
   *      远程文件路径
   *
   * @param local
   *      本地文件路径
   *
   * @return 是否成功
   *
   * @throws IOException
   */ 

  @SuppressWarnings("resource")
  public FTPStatus download(String remote, String local) throws IOException
  { 

    ftpClient.enterLocalPassiveMode(); 

    ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 

    FTPStatus result; 

    File f = new File(local); 

    FTPFile[] files = ftpClient.listFiles(remote); 

    if (files.length != 1)
    {
      Log.getLogger(this.getClass()).info("远程文件不唯一");
      return FTPStatus.File_Not_Unique;
    } 

    long lRemoteSize = files[0].getSize(); 

    if (f.exists())
    {
      OutputStream out = new FileOutputStream(f, true);
      Log.getLogger(this.getClass()).info("本地文件大小为:" + f.length()); 

      if (f.length() >= lRemoteSize)
      { 

        Log.getLogger(this.getClass()).info("本地文件大小大于远程文件大小,下载中止");
        return FTPStatus.Remote_smaller_local; 

      } 

      ftpClient.setRestartOffset(f.length()); 

      boolean status = ftpClient.retrieveFile(remote, out);
      result=status?FTPStatus.Download_From_Break_Success:FTPStatus.Download_From_Break_Faild;
      out.close(); 

    } else
    {
      OutputStream out = new FileOutputStream(f);
      boolean status = ftpClient.retrieveFile(remote, out);
      result=status?FTPStatus.Download_From_Break_Success:FTPStatus.Download_From_Break_Faild;
      out.close();
    } 

    return result; 

  } 

  /**
   *
   * 上传文件到FTP服务器,支持断点续传
   *
   * @param local
   *      本地文件名称,绝对路径
   *
   * @param remote
   *      远程文件路径,使用/home/directory1/subdirectory/file.ext
   *      按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构
   *
   * @return 上传结果
   *
   * @throws IOException
   */ 

  @SuppressWarnings("resource")
  public FTPStatus upload(String local, String remote) throws IOException
  {
    // 设置PassiveMode传输
    ftpClient.enterLocalPassiveMode(); 

    // 设置以二进制流的方式传输
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 

    FTPStatus result; 

    // 对远程目录的处理
    String remoteFileName = remote; 

    if (remote.contains("/"))
    { 

      remoteFileName = remote.substring(remote.lastIndexOf("/") + 1); 

      String directory = remote.substring(0, remote.lastIndexOf("/") + 1); 

      if (!directory.equalsIgnoreCase("/") && !ftpClient.changeWorkingDirectory(directory))
      { 

        // 如果远程目录不存在,则递归创建远程服务器目录 

        int start = 0; 

        int end = 0; 

        if (directory.startsWith("/"))
        { 

          start = 1; 

        } else
        { 

          start = 0; 

        } 

        end = directory.indexOf("/", start); 

        while (true)
        { 

          String subDirectory = remote.substring(start, end); 

          if (!ftpClient.changeWorkingDirectory(subDirectory))
          { 

            if (ftpClient.makeDirectory(subDirectory))
            { 

              ftpClient.changeWorkingDirectory(subDirectory); 

            } else
            { 

              Log.getLogger(this.getClass()).info("创建目录失败"); 

              return FTPStatus.Create_Directory_Fail; 

            } 

          } 

          start = end + 1; 

          end = directory.indexOf("/", start); 

          // 检查所有目录是否创建完毕 

          if (end <= start)
          { 

            break; 

          } 

        } 

      } 

    } 

    // 检查远程是否存在文件 

    FTPFile[] files = ftpClient.listFiles(remoteFileName); 

    if (files.length == 1)
    { 

      long remoteSize = files[0].getSize(); 

      File f = new File(local); 

      long localSize = f.length(); 

      if (remoteSize == localSize)
      { 

        return FTPStatus.File_Exits; 

      } else if (remoteSize > localSize)
      { 

        return FTPStatus.Remote_Bigger_Local; 

      } 

      // 尝试移动文件内读取指针,实现断点续传 

      InputStream is = new FileInputStream(f); 

      if (is.skip(remoteSize) == remoteSize)
      { 

        ftpClient.setRestartOffset(remoteSize); 

        if (ftpClient.storeFile(remote, is))
        { 

          return FTPStatus.Upload_From_Break_Success; 

        } 

      } 

      // 如果断点续传没有成功,则删除服务器上文件,重新上传 

      if (!ftpClient.deleteFile(remoteFileName))
      { 

        return FTPStatus.Delete_Remote_Faild; 

      } 

      is = new FileInputStream(f); 

      if (ftpClient.storeFile(remote, is))
      { 

        result = FTPStatus.Upload_New_File_Success; 

      } else
      { 

        result = FTPStatus.Upload_New_File_Failed; 

      } 

      is.close(); 

    } else
    { 

      InputStream is = new FileInputStream(local); 

      if (ftpClient.storeFile(remoteFileName, is))
      { 

        result = FTPStatus.Upload_New_File_Success; 

      } else
      { 

        result = FTPStatus.Upload_New_File_Failed; 

      } 

      is.close();
    } 

    return result; 

  } 

  /**
   *
   * 断开与远程服务器的连接
   *
   * @throws IOException
   */ 

  public void disconnect() throws IOException
  { 

    if (ftpClient.isConnected())
    {
      ftpClient.disconnect();
    } 

  } 

  public static void main(String[] args)
  {
    FTPUtils myFtp = new FTPUtils();
    try
    { 

      myFtp.connect("192.168.1.200", 21, "duser", "HTPDuserXP32"); 

      Log.getLogger(FTPUtils.class).info(myFtp.upload("C:\\Users\\Administrator\\Desktop\\swing.drawer.jar", "/jars/swing.drawer.jar")); 

      myFtp.disconnect(); 

    } catch (IOException e)
    { 

      Log.getLogger(FTPUtils.class).info("FTP上传文件异常:" + e.getMessage()); 

    } 

  } 

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, ftp
, apache
, 上传
, ftp修改文件名
ftp删除文件夹
ftp上传文件名乱码、ftp上传中文文件名、apache ftp 上传文件、java实现ftp上传下载、java实现ftp上传文件,以便于您获取更多的相关知识。

时间: 2024-10-25 03:44:45

java基于Apache FTP实现文件上传、下载、修改文件名、删除_java的相关文章

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

在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中struts2实现文件上传下载功能实例解析_java

本文实例讲述了java中struts2实现文件上传下载功能实现方法.分享给大家供大家参考.具体分析如下: 1.文件上传 首先是jsp页面的代码 在jsp页面中定义一个上传标签   复制代码 代码如下: <tr>      <td align="right" bgcolor="#F5F8F9"><b>附件:</b></td>      <td bgcolor="#FFFFFF">

java文件上传下载功能实现代码_java

本文实例为大家分享了文件上传下载java实现代码,供大家参考,具体内容如下 前台: 1. 提交方式:post2. 表单中有文件上传的表单项: <input type="file" />3. 指定表单类型:     默认类型:enctype="application/x-www-form-urlencoded"     文件上传类型:multipart/form-data FileUpload 文件上传功能开发中比较常用,apache也提供了文件上传组件!

JavaWeb实现文件上传下载功能实例解析_java

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

JavaWeb文件上传下载功能示例解析_java

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 1. 上传简单示例 Jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"&g

JavaEE中struts2实现文件上传下载功能实例解析_java

本文实例为大家分享了struts2实现文件上传下载的具体实现代码,供大家参考,具体内容如下 一.文件上传 struts提交的文件组件上传, 前台: 1).提交方式POST 2).表单类型 multipart/form-data 3).input type=file 后台: Apache提供的FileUpload组件 核心类: FileItemFactory FileItem的工厂 ServletFileUpload servlet 中的文件上传的核心类 FileItem 封装了上传的表单文件项的

JavaWeb中struts2实现文件上传下载功能实例解析_java

在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的源代码进行一下讲解,这里需要导入文件下载上传的两个jar文件,一个是commons-fileupload-1.2.2.jar,另一个是commons-io-2.0.

Apache Commons fileUpload文件上传多个示例分享_java

本文通过实例来介绍如何使用commons-fileupload.jar,Apache的commons-fileupload.jar可方便的实现文件的上传功能,具体内容如下 将Apache的commons-fileupload.jar放在应用程序的WEB-INF\lib下,即可使用.下面举例介绍如何使用它的文件上传功能. 所使用的fileUpload版本为1.2,环境为Eclipse3.3+MyEclipse6.0.FileUpload 是基于 Commons IO的,所以在进入项目前先确定Com

使用Android的OkHttp包实现基于HTTP协议的文件上传下载_Android

OkHttp的HTTP连接基础虽然在使用 OkHttp 发送 HTTP 请求时只需要提供 URL 即可,OkHttp 在实现中需要综合考虑 3 种不同的要素来确定与 HTTP 服务器之间实际建立的 HTTP 连接.这样做的目的是为了达到最佳的性能. 首先第一个考虑的要素是 URL 本身.URL 给出了要访问的资源的路径.比如 URL http://www.baidu.com 所对应的是百度首页的 HTTP 文档.在 URL 中比较重要的部分是访问时使用的模式,即 HTTP 还是 HTTPS.这会