`
lishumingwm163.com
  • 浏览: 336769 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java 断点续传

    博客分类:
  • java
阅读更多
主要使用apache中的net包来实现。网址http://commons.apache.org/net/。具体包的下载和API文档请看官网。     断点上传就是在上传的过程中设置传输的起始位置。并设置二进制传输。 Java代码
1.package apache.net.test;  
2. 
3.import java.io.File;   
4.import java.io.FileInputStream;   
5.import java.io.FileOutputStream;   
6.import java.io.IOException;   
7.import java.io.InputStream;   
8.import java.io.OutputStream;   
9.import java.io.PrintWriter;   
10.import org.apache.commons.net.PrintCommandListener;   
11.import org.apache.commons.net.ftp.FTP;   
12.import org.apache.commons.net.ftp.FTPClient;   
13.import org.apache.commons.net.ftp.FTPFile;   
14.import org.apache.commons.net.ftp.FTPReply;   
15. 
16.public class ContinueFTP {   
17.    private FTPClient ftpClient = new FTPClient();   
18.      
19.    public ContinueFTP(){   
20.        //设置将过程中使用到的命令输出到控制台   
21.        this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));   
22.    }  
23.      
24.    /** 
25.     * 连接到FTP服务器 
26.     * @param hostname 主机名 
27.     * @param port 端口 
28.     * @param username 用户名 
29.     * @param password 密码 
30.     * @return 是否连接成功 
31.     * @throws IOException 
32.     */ 
33.    public boolean connect(String hostname,int port,String username,String password) throws IOException{   
34.        ftpClient.connect(hostname, port);  
35.        if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){   
36.            if(ftpClient.login(username, password)){   
37.                return true;   
38.            }  
39.        }  
40.        disconnect();  
41.        return false;   
42.    }  
43.      
44.    /** 
45.     * 从FTP服务器上下载文件 
46.     * @param remote 远程文件路径 
47.     * @param local 本地文件路径 
48.     * @return 是否成功 
49.     * @throws IOException 
50.     */ 
51.    public boolean download(String remote,String local) throws IOException{   
52.        ftpClient.enterLocalPassiveMode();  
53.        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);  
54.        boolean result;   
55.        File f = new File(local);   
56.        FTPFile[] files = ftpClient.listFiles(remote);  
57.        if(files.length != 1){   
58.            System.out.println("远程文件不唯一");   
59.            return false;   
60.        }  
61.        long lRemoteSize = files[0].getSize();   
62.        if(f.exists()){   
63.            OutputStream out = new FileOutputStream(f,true);   
64.            System.out.println("本地文件大小为:"+f.length());   
65.            if(f.length() >= lRemoteSize){   
66.                System.out.println("本地文件大小大于远程文件大小,下载中止");   
67.                return false;   
68.            }  
69.            ftpClient.setRestartOffset(f.length());  
70.            result = ftpClient.retrieveFile(remote, out);  
71.            out.close();  
72.        }else {   
73.            OutputStream out = new FileOutputStream(f);   
74.            result = ftpClient.retrieveFile(remote, out);  
75.            out.close();  
76.        }  
77.        return result;   
78.    }  
79.      
80.    /** 
81.     * 上传文件到FTP服务器,支持断点续传 
82.     * @param local 本地文件名称,绝对路径 
83.     * @param remote 远程文件路径,使用/home/directory1/subdirectory/file.ext 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 
84.     * @return 上传结果 
85.     * @throws IOException 
86.     */ 
87.    public UploadStatus upload(String local,String remote) throws IOException{   
88.        //设置PassiveMode传输   
89.        ftpClient.enterLocalPassiveMode();  
90.        //设置以二进制流的方式传输   
91.        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);  
92.        UploadStatus result;  
93.        //对远程目录的处理   
94.        String remoteFileName = remote;  
95.        if(remote.contains("/")){   
96.            remoteFileName = remote.substring(remote.lastIndexOf("/")+1);   
97.            String directory = remote.substring(0,remote.lastIndexOf("/")+1);   
98.            if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(directory)){   
99.                //如果远程目录不存在,则递归创建远程服务器目录   
100.                int start=0;   
101.                int end = 0;   
102.                if(directory.startsWith("/")){   
103.                    start = 1;   
104.                }else{   
105.                    start = 0;   
106.                }  
107.                end = directory.indexOf("/",start);   
108.                while(true){   
109.                    String subDirectory = remote.substring(start,end);  
110.                    if(!ftpClient.changeWorkingDirectory(subDirectory)){   
111.                        if(ftpClient.makeDirectory(subDirectory)){   
112.                            ftpClient.changeWorkingDirectory(subDirectory);  
113.                        }else {   
114.                            System.out.println("创建目录失败");   
115.                            return UploadStatus.Create_Directory_Fail;   
116.                        }  
117.                    }  
118.                      
119.                    start = end + 1;   
120.                    end = directory.indexOf("/",start);   
121.                      
122.                    //检查所有目录是否创建完毕   
123.                    if(end <= start){   
124.                        break;   
125.                    }  
126.                }  
127.            }  
128.        }  
129.          
130.        //检查远程是否存在文件   
131.        FTPFile[] files = ftpClient.listFiles(remoteFileName);  
132.        if(files.length == 1){   
133.            long remoteSize = files[0].getSize();   
134.            File f = new File(local);   
135.            long localSize = f.length();   
136.            if(remoteSize==localSize){   
137.                return UploadStatus.File_Exits;   
138.            }else if(remoteSize > localSize){   
139.                return UploadStatus.Remote_Bigger_Local;   
140.            }  
141.              
142.            //尝试移动文件内读取指针,实现断点续传   
143.            InputStream is = new FileInputStream(f);   
144.            if(is.skip(remoteSize)==remoteSize){   
145.                ftpClient.setRestartOffset(remoteSize);  
146.                if(ftpClient.storeFile(remote, is)){   
147.                    return UploadStatus.Upload_From_Break_Success;   
148.                }  
149.            }  
150.              
151.            //如果断点续传没有成功,则删除服务器上文件,重新上传   
152.            if(!ftpClient.deleteFile(remoteFileName)){   
153.                return UploadStatus.Delete_Remote_Faild;   
154.            }  
155.            is = new FileInputStream(f);   
156.            if(ftpClient.storeFile(remote, is)){       
157.                result = UploadStatus.Upload_New_File_Success;  
158.            }else{   
159.                result = UploadStatus.Upload_New_File_Failed;  
160.            }  
161.            is.close();  
162.        }else {   
163.            InputStream is = new FileInputStream(local);   
164.            if(ftpClient.storeFile(remoteFileName, is)){   
165.                result = UploadStatus.Upload_New_File_Success;  
166.            }else{   
167.                result = UploadStatus.Upload_New_File_Failed;  
168.            }  
169.            is.close();  
170.        }  
171.        return result;   
172.    }  
173.    /** 
174.     * 断开与远程服务器的连接 
175.     * @throws IOException 
176.     */ 
177.    public void disconnect() throws IOException{   
178.        if(ftpClient.isConnected()){   
179.            ftpClient.disconnect();  
180.        }  
181.    }  
182.      
183.    public static void main(String[] args) {   
184.        ContinueFTP myFtp = new ContinueFTP();   
185.        try {   
186.            myFtp.connect("192.168.21.171", 21, "test", "test");   
187.            System.out.println(myFtp.upload("E:\\VP6.flv", "/MIS/video/VP6.flv"));   
188.            myFtp.disconnect();  
189.        } catch (IOException e) {   
190.            System.out.println("连接FTP出错:"+e.getMessage());   
191.        }  
192.    }  
193.} 
分享到:
评论

相关推荐

    java断点续传

    Java断点续传技术在实际应用中广泛用于文件上传和下载工具,如迅雷、FTP客户端等,它有效地解决了大文件传输过程中的网络问题,提高了用户体验。了解并掌握这种技术对于开发高效的网络应用至关重要。

    java断点续传,刚刚整理出来多线程处理

    Java 断点续传技术是网络传输中常用的一种机制,特别是在大文件下载或上传时,如果因为网络中断或其他原因导致传输失败,可以借助断点续传功能从上次中断的地方继续,而无需重新开始。在Java中实现断点续传,通常...

    Java断点续传

    Java 断点续传技术是网络传输中一种高效的数据...通过以上分析,我们可以看出Java断点续传涉及到了网络编程、文件操作、状态管理和错误处理等多个方面的知识,它在实际应用中能有效提高大文件传输的效率和用户体验。

    java 断点续传

    Java 断点续传技术是Java编程中一种重要的文件传输策略,主要用于大文件的上传和下载,能够提高网络效率并优化用户体验。在处理大文件时,由于网络不稳定、用户操作中断或其他因素,可能会导致文件传输失败。断点续...

    java断点续传Demo

    总之,Java断点续传技术是提高大文件下载效率的重要手段,通过HTTP的Range请求实现与服务器的交互,确保用户可以在任何时间点继续未完成的下载任务。在实际开发中,我们需要注意处理各种异常情况,以提供稳定可靠的...

    java断点续传源代码

    综上所述,Java断点续传技术涉及网络编程、文件操作和异常处理等多个方面,通过合理的实现可以显著提高大文件下载的效率和用户体验。理解并掌握这些知识点对于开发高效的文件下载应用至关重要。

    java断点续传的原理

    Java 断点续传的原理主要涉及到网络编程、文件处理以及多线程技术。断点续传是指在上传或下载大文件时,如果因为网络中断或其他原因导致传输不完整,可以从上次中断的地方继续传输,而不需要从头开始,极大地提高了...

    java断点续传上传

    Java 断点续传上传是一种在文件传输过程中,如果因为网络中断或其他原因导致传输不完整,可以从上次中断的位置继续上传的技术。这种技术尤其在大文件传输时非常有用,避免了因网络问题而需要重新上传整个文件的困扰...

    java断点续传,带进度条插件

    总之,Java断点续传技术结合进度条插件,为大文件上传提供了高效和用户友好的解决方案。通过合理利用如`HttpUploader5Utf8MySQL`这样的工具,开发者可以轻松实现这一功能,并结合MySQL数据库进行状态管理,提升系统...

    java断点续传实例

    Java 断点续传是一种在下载大文件时...通过以上这些知识点,您可以构建一个功能完备的Java断点续传下载器。实际开发时,还需要考虑其他因素,如网络状况的动态适应、下载策略优化等,以提供更高效和稳定的下载体验。

    Java实现断点续传

    Java实现断点续传是一项在文件传输中非常实用的技术,特别是在大文件传输或者网络不稳定的情况下。断点续传允许用户在文件传输中断后从上次中断的位置继续,而不是重新开始整个传输过程,极大地提高了效率和用户体验...

    java断点续传与多线程下载

    Java 断点续传与多线程下载是网络编程中两个重要的技术,它们在处理大文件下载时尤其有用。断点续传允许用户在下载中断后从上次停止的地方继续,而多线程下载则通过同时从服务器获取多个数据块来提高下载速度。接...

    java 断点续传代码

    该资源为java断点续传的代码,非常有用!

    基于Vue和Java的断点续传与大文件上传系统设计源码

    本项目是一个基于Vue和Java的断点续传与大文件上传系统设计源码,共包含563个文件,其中包括258个Java文件、82个SVG文件等。系统采用了Vue-uploader和若依框架,为用户提供了一个便捷的文件上传解决方案。系统支持多...

Global site tag (gtag.js) - Google Analytics