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_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_locall(12); 

  private int status; 

  public int getStatus()
  {
    return status;
  } 

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

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

2、工具类代码:

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

public class ContinueFTP
{ 

  private FTPClient ftpClient = new FTPClient(); 

  /**
   * 对象构造 设置将过程中使用到的命令输出到控制台
   */
  public ContinueFTP()
  {
    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
   *      远程文件路径
   *
   * @param local
   *      本地文件路径
   *
   * @return 是否成功
   *
   * @throws IOException
   */ 

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

    ftpClient.enterLocalPassiveMode(); 

    ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 

    boolean result; 

    File f = new File(local); 

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

    if (files.length != 1)
    {
      System.out.println("远程文件不唯一");
      return false;
    } 

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

    if (f.exists())
    {
      OutputStream out = new FileOutputStream(f, true);
      System.out.println("本地文件大小为:" + f.length()); 

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

        System.out.println("本地文件大小大于远程文件大小,下载中止"); 

        return false; 

      } 

      ftpClient.setRestartOffset(f.length()); 

      result = ftpClient.retrieveFile(remote, out); 

      out.close(); 

    } else
    { 

      OutputStream out = new FileOutputStream(f);
      result = ftpClient.retrieveFile(remote, out);
      out.close();
    } 

    return result; 

  } 

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

  @SuppressWarnings("resource")
  public UploadStatus upload(String local, String remote) throws IOException
  { 

    // 设置PassiveMode传输 

    ftpClient.enterLocalPassiveMode(); 

    // 设置以二进制流的方式传输 

    ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 

    UploadStatus 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
            { 

              System.out.println("创建目录失败"); 

              return UploadStatus.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 UploadStatus.File_Exits; 

      } else if (remoteSize > localSize)
      { 

        return UploadStatus.Remote_Bigger_Local; 

      } 

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

      InputStream is = new FileInputStream(f); 

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

        ftpClient.setRestartOffset(remoteSize); 

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

          return UploadStatus.Upload_From_Break_Success; 

        } 

      } 

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

      if (!ftpClient.deleteFile(remoteFileName))
      { 

        return UploadStatus.Delete_Remote_Faild; 

      } 

      is = new FileInputStream(f); 

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

        result = UploadStatus.Upload_New_File_Success; 

      } else
      { 

        result = UploadStatus.Upload_New_File_Failed; 

      } 

      is.close(); 

    } else
    { 

      InputStream is = new FileInputStream(local); 

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

        result = UploadStatus.Upload_New_File_Success; 

      } else
      { 

        result = UploadStatus.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)
  {
    ContinueFTP myFtp = new ContinueFTP();
    try
    { 

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

      System.out.println(myFtp.upload("C:\\Users\\Administrator\\Desktop\\swing.drawer.jar", "/jars/swing.drawer.jar")); 

      myFtp.disconnect(); 

    } catch (IOException e)
    { 

      System.out.println("连接FTP出错:" + e.getMessage()); 

    } 

  } 

} 

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

(0)

相关推荐

  • apache+php上传大文件以上传100M为例

    打开php.ini, Ctrl+F 找到下面的项并修改之.下面以上传100M为例. file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹 upload_max_filesize = 100m ;望文生意,即允许上传文件大小的最大值.默认为2M post_max_size = 100M ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值.

  • jquery uploadify和apache Fileupload实现异步上传文件示例

    jQuery Uploadify + Apache Fileupload异步上传文件示例1.可以限制上传文件大小和类型,理论上任何类型的文件都可以上传(自己根据api配置即可):2.后台使用Apache commons-fileupload-1.3.1.jar作为上传工具包,本示例支持一次性多文件上传:3.文件上传目录可以任意指定,请在web.xml中配置:Uploadify api 详见http://www.uploadify.com/documentation/ FileUploadServ

  • Apache上传文件500错误的解决方法

    打开Apache的httpd.conf配置文件,在这个文件里增加下面的参数设置即可. 复制代码 代码如下: MaxRequestLen 10240000 我这里设置为10M,比PHP上传默认最大值8M略大即可.你可以根据自己的需要,调整这个参数的值,注意这个参数的单位是字节. 配置完成后重启Apache即可.

  • Apache Commons fileUpload实现文件上传之一

    废话不多说了,直奔主题了. 需要两个jar包: commons-fileupload.jar Commons IO的jar包(本文使用commons-io-2.4.jar) 利用Servlet来实现文件上传. package web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.

  • 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

  • 解决RHAS3中Apache2的PHP上传文件大小的限制

    近日将论坛从VBB2升级到VBB3,将上传附件大小设置为2M,可每次上传超过500K的附件都会出错,而之前使用VBB2时却正常. 仔细检查php.ini,其中的upload_max_filesize=8m,没有任何问题,然后将其中的: max_execution_time = 30 max_input_time = 60memory_limit = 8M 数值分别调大到120.180.32M,还是没有任何作用,令人非常头痛! 然后开始怀疑是http.conf配置文件出现的问题,但从头到尾检查了一

  • Apache 文件上传与文件下载案例详解

    写一个Apache文件上传与文件下载的案例:以供今后学习 web.xml配置如下: <span style="font-family:SimSun;font-size:14px;"><?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns=&

  • 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 web图片上传和文件上传实例

    图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多,但底层的实现都是文件的读写操作. 注意事项 1.form表单一定要写属性enctype="multipart/form-data" 2.为了能保证文件能上传成功file控件的name属性值要和你提交的控制层变量名一致, 例如空间名是file那么你要在后台这样定义 private File file; //file控件名 private String fileContentType;//图

  • java web图片上传和文件上传实例详解

    java web图片上传和文件上传 图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多,但底层的实现都是文件的读写操作. 注意事项 1.form表单一定要写属性enctype="multipart/form-data" 2.为了能保证文件能上传成功file控件的name属性值要和你提交的控制层变量名一致, 例如空间名是file那么你要在后台这样定义 private File file; //file控件名 private String f

  • Java全面深入探究SpringBoot拦截器与文件上传

    目录 拦截器 拦截器的概念 拦截器的配置 配置拦截器 拦截器的原理 文件上传 更改文件上传大小 拦截器 拦截器的概念 动态拦截Actioon调用的对象,使开发者在一个Actioon执行的前后执行一段代码,也可以在Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式. 作用: 动态拦截Action调用的对象(也就是实际项目中的controller层的接口) 一般拦截器用于对用户访问的限制.如当用户没有登录时访问主页面,则可以使用拦截器进行拦截并重定向到登录页面.

  • SpringMVC文件上传 多文件上传实例

    必须明确告诉DispatcherServlet如何处理MultipartRequest.SpringMVC中提供了文件上传使用方式如下配置xxx-servlet.xml,添加如下代码: 复制代码 代码如下: <bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">          <!-- 设置

  • java文件上传技术深入剖析

    本文实例为大家分享了java文件上传技术,供大家参考,具体内容如下 表单: 客户端发送HTTP必须使用multipart/form-data数据类型,表示复合数据类型.即: 在表单中使用html标签. 需要的包:         Commons-fileupload.jar,核心上传文件工具都在这个包中.         commons-io.jar – 上传文件所需要的包 上传文件类详解: DiskFileItemFactory-创建监时文件目录,指是缓存区大小 ServletFileUplo

  • java使用smartupload组件实现文件上传的方法

    本文实例讲述了java使用smartupload组件实现文件上传的方法.分享给大家供大家参考.具体分析如下: 文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,这里主要说明smartupload组件上传. 在讲解smartupload上传前,我们先来看看不使用组件是怎么完成上传的原理的? 废话不多说直接上代码: 复制代码 代码如下: import java.io.*; import java.util.*; import javax.servle

  • java中struts2实现简单的文件上传与下载

    一.Struts2文件上传  Struts2的文件上传实现非常简单,只需要简单几步就可完成: 注意: (1)文件上传的struts2标签为:<s:file name="" label="上传"/> (2)文件上传的前提是表单属性method="post" enctype="multipart/form-data"; (3)web应用中必须包含common-fileupload.jar和common-io.jar,因

随机推荐