`

java终实现ftp断点上传

    博客分类:
  • Java
阅读更多

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

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

 

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

 

分享到:
评论

相关推荐

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

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

    java ftp断点上传和下载

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

    java实现ftp断点续传

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

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

    本文将深入探讨如何使用Java实现FTP断点续传,并提供相关的源码整理。 FTP断点续传的核心原理是通过FTP协议中的REST(Restart)命令来实现。REST命令告诉服务器从指定的位置开始继续传输数据,而不是重新开始。在...

    xuchuanftp_java_FTP断点续传_

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

    java FTP多线程 批量 断点续传

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

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

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

    java实现ftp上传jar包

    以上就是关于"java实现ftp上传jar包"的相关知识点,涵盖了FTP协议、相关库的使用、JAR文件的处理以及基本的Java FTP操作。在实际项目中,你可能还需要考虑其他因素,如连接超时、重试策略、文件权限管理等。

    java ftp 上传 下载 断点续传

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

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

    Java实现FTP批量大文件上传下载 一、Java FTP客户端库的选择 在选择Java FTP客户端库时,需要考虑多个因素,例如性能、安全性、可靠性等。当前有多种FTP客户端库可供选择,例如J-FTP、SimpleFTP、FTPClient等。每...

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

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

    java实现FTP断点续传

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

    JAVA实现FTP断点上传的方法

    在Java中实现FTP断点上传是一项常见的任务,特别是在文件传输需求中。Apache Commons Net库提供了一个强大且方便的API来处理FTP操作,包括断点上传。以下是对标题和描述中所述知识点的详细解释: 首先,我们需要...

    java实现FTP多线程断点续传

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

    java实现ftp上传下载

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

    java实现ftp自动上传文件

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

    实现ftp断点下载和上传

    在实现FTP断点下载和上传时,通常会使用编程语言中的FTP库或工具。例如,在Java中,可以使用Apache Commons Net库,它提供了FTPClient类来支持FTP功能,包括断点续传。Python中则有ftplib模块,同样可以处理此类...

    java apatche ftp 支持断点续传等

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

Global site tag (gtag.js) - Google Analytics