`
sunrenen
  • 浏览: 40221 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java中ftp断点上传功能的实现

阅读更多
主要使用apache中的net包来实现。网址http://commons.apache.org/net/。具体包的下载和API文档请看官网。

    断点上传就是在上传的过程中设置传输的起始位置。并设置二进制传输。


package apache.net.test;

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)));
	}
	
	/**
	 * 连接到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());
		}
	}
}
分享到:
评论
1 楼 yuanyu5237 2011-05-10  

我想知道UploadStatus 是个是哪儿来的,能不能解释下

相关推荐

    java ftp断点上传和下载

    以上就是使用Java和Apache Commons Net库实现FTP断点续传的基本步骤。在实际应用中,你可能还需要处理异常,优化文件读写性能,以及考虑其他因素,如重试机制、错误处理等。了解这些知识点将使你能够高效地实现在...

    xuchuanftp_java_FTP断点续传_

    总之,Java中的FTP断点续传功能是通过与FTP服务器的交互,结合特定的FTP命令和状态管理来实现的。这种功能对于任何需要进行大量文件传输的系统都非常重要,因为它提高了效率并减少了网络资源的浪费。

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

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

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

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

    java ftp 上传 下载 断点续传

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

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

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

    Java实现FTP批量大文件上传下载.pdf

    在Java中实现FTP批量大文件上传下载需要使用FTP客户端库,例如J-FTP。首先,需要建立FTP连接,接着使用FTP客户端库上传或下载文件。在上传过程中,可以使用断点续传功能,以便在上传过程中出现问题时,可以从断点...

    java实现FTP断点续传

    Java 实现 FTP 断点续传是一项常见的...总的来说,实现Java中的FTP断点续传涉及理解FTP协议,使用适当的库,以及处理可能出现的网络和文件系统问题。在开发过程中,注意错误处理和性能优化,确保功能的稳定性和效率。

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

    Java FTP技术是Java编程中用于实现文件传输协议(FTP)的一种方法,主要用于在客户端和服务器之间上传、下载文件。在Java中,我们可以使用`java.net`包中的`Socket`类来实现基本的FTP功能,但更常见的是使用Apache ...

    java实现ftp断点续传

    Java实现FTP断点续传是一项在开发中常遇到的需求,主要应用于大文件传输或网络不稳定时确保文件完整传输。FTP(File Transfer Protocol)是互联网上用于文件传输的标准协议,而断点续传则是FTP的一个重要特性,允许...

    java实现ftp上传jar包

    在Java中,我们可以使用多种库来实现FTP功能。 2. **Java FTP库**:在描述中提到了`edtftpj.jar`,这是一个Java FTP客户端库,提供了一种简单的方式来处理FTP连接和文件传输。另外,`commons-net-1.4.1.jar`是...

    java apatche ftp 支持断点续传等

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

    JAVA实现FTP断点上传的方法

    在Java中实现FTP断点上传是一项常见的任务,特别是在文件传输需求中。...以下是对标题和描述中所述...通过这种方式,我们可以实现Java中的FTP断点上传功能,即使在网络不稳定或意外中断的情况下,也能有效地继续上传文件。

    java中实现ftp下载功能

    在Java编程环境中,FTP(File Transfer Protocol)下载功能的实现主要涉及到网络编程和文件操作,尤其是当需要支持断点下载时,需要对FTP协议有深入的理解。断点下载是指在网络中断或用户暂停后能从上次中断的位置...

    java实现FTP多线程断点续传

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

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

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

    java实现ftp自动上传文件

    Java 实现FTP自动上传文件是一项常见的任务,尤其在自动化运维和数据传输中。这个程序能够遍历指定磁盘的所有文件,包括子目录,并通过FTP协议将它们上传到远程服务器。以下是一些关于如何使用Java实现FTP自动上传的...

    java实现ftp上传下载

    Java实现FTP上传下载是Java开发中常见的任务,主要用于在服务器和客户端之间传输文件。FTP(File Transfer Protocol)是一种用于在Internet上进行文件传输的标准协议。本篇将详细讲解如何使用Java来实现FTP的上传和...

Global site tag (gtag.js) - Google Analytics