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

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

    } 

  } 

}

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

(0)

相关推荐

  • Java中使用Apache POI读取word文件简单示例

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 1.读取word 2003及word 2007需要的jar包 读取 2003 版本(.doc)的word文件相对来说比较简单,只需要 poi-3.5-beta6-20090622.jar 和 poi-scratchpad-3.5-beta6-20090622.jar 两个 jar 包即可, 而 2007 版本(.docx)就麻烦多,我说的这个麻烦不

  • java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.setXmlVersion问题解决方法

    读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵. DOM解析的特性就是读取xml文件转换为 dom树形结构,通过节点进行遍历. 这是W3c关于节点的概念 如果xml中包含有大量的数据,由于dom一次性把xml装入内存中的特性,所以dom不适合于包含大量数据的xml解析.当包含有大量xml的时候,用SAX进行解析比较节省内存. 下面是一个运用DOM进行解析xml文件的例子: xml文件结构如下: <?xm

  • Apache Commons Math3探索之快速傅立叶变换代码示例

    上一篇文章中我们了解了Apache Commons Math3探索之多项式曲线拟合实现代码,今天我们就来看看如何通过apache commons math3实现快速傅里叶变换,下面是具体内容. 傅立叶变换:org.apache.commons.math3.transform.FastFourierTransformer类. 用法示例代码: double inputData = new double[arrayLength]; // ... 给inputData赋值 FastFourierTran

  • SVN出现提示org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir解决方案

    SVN出现提示org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir解决方案 第一种方法: 通过svn插件来清理,首先选中项目,右键,选择team->refresh/cleanup即可.然后再更新文件就不会提示org.apache.subversion.javahl.ClientException: Attempted to lock an already-lockeddir了.但

  • java Apache poi 对word doc文件进行读写操作

    使用POI读写Word doc文件 Apache poi的hwpf模块是专门用来对word doc文件进行读写操作的.在hwpf里面我们使用HWPFDocument来表示一个word doc文档.在HWPFDocument里面有这么几个概念: Range:它表示一个范围,这个范围可以是整个文档,也可以是里面的某一小节(Section),也可以是某一个段落(Paragraph),还可以是拥有共同属性的一段文本(CharacterRun).   Section:word文档的一个小节,一个word文

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

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

  • Java 基于tcp协议实现文件上传

    服务端 package lesson02; import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 服务端接收文件 */ public class TcpServerDemo2 { public static void main(String[] args) throws IOException { //1.创建服务 ServerSocket serverSocket = new ServerSo

  • Java 基于TCP Socket 实现文件上传

    文件上传过程一个单向Socket通信过程.客户端通过文件输入流读取文件,然后从Socket获取输出流写入数据.服务端从Socket中获得输入流,然后写入文件输出流,写入数据完成则上传完成. 服务端UploadServer: public class UplaodServer { public static void main(String []args){ try( // 创建一个ServerSocket监听8080端口的请求 // ServerSocket 实现了 AutoCloseable接

  • Java Servlet简单实例分享(文件上传下载demo)

    项目结构 src com servletdemo DownloadServlet.java ShowServlet.java UploadServlet.java WebContent jsp servlet download.html fileupload.jsp input.jsp WEB-INF lib commons-fileupload-1.3.1.jar commons-io-2.4.jar 1.简单实例 ShowServlet.java package com.servletdem

  • Java 客户端操作 FastDFS 实现文件上传下载替换删除功能

    FastDFS 的作者余庆先生已经为我们开发好了 Java 对应的 SDK.这里需要解释一下:作者余庆并没有及时更新最新的 Java SDK 至 Maven 中央仓库,目前中央仓库最新版仍旧是 1.27 版.所以我们需要通过 Github:https://github.com/happyfish100/fastdfs-client-java 下载项目源码,再通过命令 mvn clean install 编译打包导入 Maven 仓库使用即可. 接下来我们通过 Java API 操作 FastDF

  • 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

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

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

  • java基于Apache FTP点断续传的文件上传和下载

    基于Apache FTP实现文件上传下载工具 ,上传文件时需要考虑以下问题(实例是续传功能): (1). FTP服务器是否存在改目录,如果不存在目录则需要创建目录. (2).判断上传文件是否已经存在,如果存在是需要删除后再上传还是续传. 1.上传或下载状态的枚举类: package com.scengine.wtms.utils.ftp; public enum UploadStatus { File_Exits(0), Create_Directory_Success(1), Create_D

  • 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

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

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

随机推荐