`

java实现FTP断点续传

    博客分类:
  • java
阅读更多

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

 

      */ 

 

     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

 

      */ 

 

     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.21.171", 21, "test", "test"); 

 

             System.out.println(myFtp.upload("E:\\VP6.flv", "/MIS/video/VP6.flv")); 

 

             myFtp.disconnect(); 

 

         } catch (IOException e) { 

 

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

 

         } 

 

     } 

 

 }

分享到:
评论

相关推荐

    java实现ftp断点续传

    以下是实现FTP断点续传的一个简要步骤: 1. 创建`FTPClient`实例并连接到FTP服务器。 2. 使用`FTPClient.login()`登录FTP服务器,提供用户名和密码。 3. 设置FTP工作模式,通常是被动模式,`FTPClient....

    java实现ftp断点续传Java实用源码整理learns

    在学习Java FTP断点续传的过程中,还可以参考`jsymxx225.zip`中提供的源码,该压缩包可能包含了一个完整的FTP断点续传实现示例。此外,`下载及使用说明.txt`文件可能包含了解压缩和运行代码的详细步骤,而`更多Java...

    xuchuanftp_java_FTP断点续传_

    标题"XuChuanFTP_Java_FTP断点续传"可能是指一个Java实现的FTP客户端库或者一个示例项目,专注于支持FTP的断点续传功能。这个项目可能是为了帮助开发者更方便地处理大文件的上传任务,尤其是在网络不稳定的情况下。 ...

    自己收集的多个Java FTP断点续传的例子源码

    java实现FTP多线程断点续传,上传下载! - java学习与交流 - j2ee学习网 - j2ee学习网 (2012年5月21日) 用 Java 实现断点续传 (HTTP) (2012年5月21日) Java写的支持断点续传的FTP--crybaby的博客 (2012年5月21日) ...

    FTP断点续传

    下面是一个简单的示例代码片段,展示如何使用Java实现FTP断点续传的基本流程: ```java import org.apache.commons.net.ftp.FTPClient; public class FtpClientExample { public static void main(String[] args)...

    Java上传文件到FTP服务器,支持断点续传.rar

    java实现ftp断点续传,上传文件到FTP服务器,支持断点续传,同时支持LINUX主机,代码里面包括了比较多的java网络操作类,比如连接FTP的常规类、递归创建远程服务器目录 上传文件到服务器,新上传和断点续传操作,远程...

    java实现FTP多线程断点续传

    ### Java实现FTP多线程断点续传:深入解析与技术要点 在现代软件开发中,数据传输是一项基本且关键的任务,特别是在处理...通过理解并应用上述关键技术点,开发者可以在自己的项目中实现高效、稳定的FTP断点续传功能。

    java ftp 多线程 断点续传等知识

    在Java FTP中,通过检查文件的大小和修改时间,可以确定是否已经部分下载,然后使用FTPClient的`restart`方法指定新的起始位置来实现断点续传。 多线程在Java FTP中常用于提高文件下载速度。通过创建多个线程,每个...

    java apatche ftp 支持断点续传等

    Apache FTP库为Java开发者提供了丰富的功能,包括主被动模式的切换、断点续传以及错误处理等,大大简化了FTP(File Transfer Protocol)客户端的实现。 首先,我们来详细了解主被动模式。在FTP协议中,有两种工作...

    ftp.rar_FTP 断点续传_Java FTP上传_ftp 断点_ftp断点续传Java_java ftp

    在这个Java FTP项目中,我们关注的是如何实现FTP的断点续传功能,以及如何利用Java进行多线程FTP上传。 断点续传是FTP的一个重要特性,它允许在文件传输中断后从上次停止的地方继续,而不是重新开始整个文件的传输...

    多线程实现ftp断点续传

    以下是一个简化的多线程FTP断点续传实现步骤: 1. **初始化连接**:创建一个FTP客户端线程,负责与服务器建立连接,登录,并切换到目标目录。 2. **检查文件状态**:客户端线程询问服务器目标文件是否存在,如果...

    java_apache_ftp断点续传(资料及实例)

    Java Apache FTP断点续传是一种在Java编程中实现FTP(文件传输协议)功能的重要技术,特别是在大文件传输时,能够提高效率并节省网络资源。Apache Commons Net是Java库,提供了丰富的FTP客户端功能,包括断点续传。...

    java ftp断点续传资料

    在这个资料包中,`ftpcode.rar`可能包含了一个实现以上步骤的Java FTP断点续传示例代码,你可以通过查看和运行这个示例来学习如何在实际项目中应用此技术。`ftpjar.rar`可能包含了一些必要的jar包,比如Apache ...

    java FTP多线程 批量 断点续传

    Java FTP多线程批量断点续传是一种在Java编程中实现高效、稳定文件传输的方法,尤其适用于大文件的上传和下载。在这个过程中,我们利用FTP(File Transfer Protocol)协议,结合多线程技术和断点续传功能,可以显著...

    java大文件分块上传断点续传demo

    本示例"java大文件分块上传断点续传demo"提供了一个完整的解决方案,它允许用户将大文件分块上传,并在上传过程中支持断点续传。 首先,理解"分块上传"的概念。分块上传是将一个大文件分割成多个小块,然后逐个上传...

    java ftp 上传 下载 断点续传

    Java FTP(File Transfer Protocol)是Java编程中用于与FTP服务器交互的一种技术,它允许程序员编写应用程序来上传、下载文件,并实现断点续传功能。在本文中,我们将深入探讨Java FTP上传、下载以及断点续传的核心...

    java,使用minio实现分片上传、秒传、断点续传,附docker安装文档

    java,minio实现分片上传、秒传、断点续传,附docker安装文档

Global site tag (gtag.js) - Google Analytics