本文为引用:[url=http://www.cnblogs.com/tt_mc/archive/2010/03/22/1691708.html]http://www.cnblogs.com/tt_mc/archive/2010/03/22/1691708.html[/url] -------------------- 利用org.apache.commons.net.ftp包实现一个简单的ftp客户端实用类。主要实现一下功能 1.支持上传下载。支持断点续传 2.支持进度汇报 3.支持对于中文目录及中文文件创建的支持。 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.RandomAccessFile; import open.mis.data.DownloadStatus; import open.mis.data.UploadStatus; 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; /** *//** * 支持断点续传的FTP实用类 * @author BenZhou [url=http://www.bt285.cn/]http://www.bt285.cn[/url] * @version 0.1 实现基本断点上传下载 * @version 0.2 实现上传下载进度汇报 * @version 0.3 实现中文目录创建及中文文件创建,添加对于中文的支持 */ public class ContinueFTP { public 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); ftpClient.setControlEncoding("GBK"); if(FTPReply.isPositiveCompletion(ftpClient.getReplyCode())){ if(ftpClient.login(username, password)){ return true; } } disconnect(); return false; } /** *//** * 从FTP服务器上下载文件,支持断点续传,上传百分比汇报 * @param remote 远程文件路径 * @param local 本地文件路径 * @return 上传的状态 * @throws IOException */ public DownloadStatus download(String remote,String local) throws IOException{ //设置被动模式 ftpClient.enterLocalPassiveMode(); //设置以二进制方式传输 ftpClient.setFileType([url=ftp://ftp.binary_file_type/]FTP.BINARY_FILE_TYPE[/url]); DownloadStatus result; //检查远程文件是否存在 FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("GBK"),"iso-8859-1")); if(files.length != 1){ System.out.println("远程文件不存在"); return DownloadStatus.Remote_File_Noexist; } long lRemoteSize = files[0].getSize(); File f = new File(local); //本地存在文件,进行断点下载 if(f.exists()){ long localSize = f.length(); //判断本地文件大小是否大于远程文件大小 if(localSize >= lRemoteSize){ System.out.println("本地文件大于远程文件,下载中止"); return DownloadStatus.Local_Bigger_Remote; } //进行断点续传,并记录状态 FileOutputStream out = new FileOutputStream(f,true); ftpClient.setRestartOffset(localSize); InputStream in = ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"),"iso-8859-1")); byte[] bytes = new byte[1024]; long step = lRemoteSize /100; long process=localSize /step; int c; while((c = in.read(bytes))!= -1){ out.write(bytes,0,c); localSize+=c; long nowProcess = localSize /step; if(nowProcess > process){ process = nowProcess; if(process % 10 == 0) System.out.println("下载进度:"+process); //TODO 更新文件下载进度,值存放在process变量中 } } in.close(); out.close(); boolean isDo = ftpClient.completePendingCommand(); if(isDo){ result = DownloadStatus.Download_From_Break_Success; }else { result = DownloadStatus.Download_From_Break_Failed; } }else { OutputStream out = new FileOutputStream(f); InputStream in= ftpClient.retrieveFileStream(new String(remote.getBytes("GBK"),"iso-8859-1")); byte[] bytes = new byte[1024]; long step = lRemoteSize /100; long process=0; long localSize = 0L; int c; while((c = in.read(bytes))!= -1){ out.write(bytes, 0, c); localSize+=c; long nowProcess = localSize /step; if(nowProcess > process){ process = nowProcess; if(process % 10 == 0) System.out.println("下载进度:"+process); //TODO 更新文件下载进度,值存放在process变量中 } } in.close(); out.close(); boolean upNewStatus = ftpClient.completePendingCommand(); if(upNewStatus){ result = DownloadStatus.Download_New_Success; }else { result = DownloadStatus.Download_New_Failed; } } return result; } /** *//** * 上传文件到FTP服务器,支持断点续传 * @param local 本地文件名称,绝对路径 * @param remote 远程文件路径,使用/home/directory1/subdirectory/file.ext或是 [url=http://www.guihua.org/]http://www.guihua.org[/url] /subdirectory/file.ext 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 * @return 上传结果 * @throws IOException */ public UploadStatus upload(String local,String remote) throws IOException{ //设置PassiveMode传输 ftpClient.enterLocalPassiveMode(); //设置以二进制流的方式传输 ftpClient.setFileType([url=ftp://ftp.binary_file_type/]FTP.BINARY_FILE_TYPE[/url]); ftpClient.setControlEncoding("GBK"); UploadStatus result; //对远程目录的处理 String remoteFileName = remote; if(remote.contains("/")){ remoteFileName = remote.substring(remote.lastIndexOf("/")+1); //创建服务器远程目录结构,创建失败直接返回 if(CreateDirecroty(remote, ftpClient)==UploadStatus.Create_Directory_Fail){ return UploadStatus.Create_Directory_Fail; } } //检查远程是否存在文件 FTPFile[] files = ftpClient.listFiles(new String(remoteFileName.getBytes("GBK"),"iso-8859-1")); 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; } //尝试移动文件内读取指针,实现断点续传 result = uploadFile(remoteFileName, f, ftpClient, remoteSize); //如果断点续传没有成功,则删除服务器上文件,重新上传 if(result == UploadStatus.Upload_From_Break_Failed){ if(!ftpClient.deleteFile(remoteFileName)){ return UploadStatus.Delete_Remote_Faild; } result = uploadFile(remoteFileName, f, ftpClient, 0); } }else { result = uploadFile(remoteFileName, new File(local), ftpClient, 0); } return result; } /** *//** * 断开与远程服务器的连接 * @throws IOException */ public void disconnect() throws IOException{ if(ftpClient.isConnected()){ ftpClient.disconnect(); } } /** *//** * 递归创建远程服务器目录 * @param remote 远程服务器文件绝对路径 * @param ftpClient FTPClient对象 * @return 目录创建是否成功 * @throws IOException */ public UploadStatus CreateDirecroty(String remote,FTPClient ftpClient) throws IOException{ UploadStatus status = UploadStatus.Create_Directory_Success; String directory = remote.substring(0,remote.lastIndexOf("/")+1); if(!directory.equalsIgnoreCase("/")&&!ftpClient.changeWorkingDirectory(new String(directory.getBytes("GBK"),"iso-8859-1"))){ //如果远程目录不存在,则递归创建远程服务器目录 int start=0; int end = 0; if(directory.startsWith("/")){ start = 1; }else{ start = 0; } end = directory.indexOf("/",start); while(true){ String subDirectory = new String(remote.substring(start,end).getBytes("GBK"),"iso-8859-1"); 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 0){ ftpClient.setRestartOffset(remoteSize); process = remoteSize /step; raf.seek(remoteSize); localreadbytes = remoteSize; } byte[] bytes = new byte[1024]; int c; while((c = raf.read(bytes))!= -1){ out.write(bytes,0,c); localreadbytes+=c; if(localreadbytes / step != process){ process = localreadbytes / step; System.out.println("上传进度:" + process); //TODO 汇报上传状态 } } out.flush(); raf.close(); out.close(); boolean result =ftpClient.completePendingCommand(); if(remoteSize > 0){ status = result?UploadStatus.Upload_From_Break_Success:UploadStatus.Upload_From_Break_Failed; }else { status = result?UploadStatus.Upload_New_File_Success:UploadStatus.Upload_New_File_Failed; } return status; } public static void main(String[] args) { ContinueFTP myFtp = new ContinueFTP(); try { myFtp.connect("192.168.21.181", 21, "nid", "123"); // myFtp.ftpClient.makeDirectory(new String("电视剧".getBytes("GBK"),"iso-8859-1")); // myFtp.ftpClient.changeWorkingDirectory(new String("电视剧".getBytes("GBK"),"iso-8859-1")); // myFtp.ftpClient.makeDirectory(new String("走西口".getBytes("GBK"),"iso-8859-1")); // System.out.println(myFtp.upload("[url=http://www.5a520.cn/]http://www.5a520.cn[/url] /yw.flv", "/yw.flv",5)); // System.out.println(myFtp.upload("[url=http://www.5a520.cn/]http://www.5a520.cn[/url] /走西口24.mp4","/央视走西口/新浪网/走西口24.mp4")); System.out.println(myFtp.download("/央视走西口/新浪网/走西口24.mp4", "E:\\走西口242.mp4")); myFtp.disconnect(); } catch (IOException e) { System.out.println("连接FTP出错:"+e.getMessage()); } } }
- 浏览: 105448 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (115)
- 项目管理 (1)
- 开发前期 (3)
- java测试 (2)
- 数据库方面 (10)
- Oracle (6)
- MySQL (3)
- Web应用服务器 (2)
- Tomcat (3)
- 服务器端 (27)
- JDK (22)
- Struts1 (1)
- Struts2 (1)
- Hibernate (0)
- Spring (3)
- SSH1 (0)
- SSH2 (0)
- SpringMVC+Hibernate (0)
- webservice (3)
- 文档处理 (1)
- 开发平台 (6)
- MyEclipse (8)
- JSP (2)
- 客户端 (11)
- HTML (5)
- CSS (0)
- JS (8)
- XML (0)
- 其他开发-ing问题 (7)
- 操作系统 (3)
- 小收藏 (21)
- 经验之谈 (10)
- 面试 (2)
- 小技巧 (3)
- Eclipse (1)
最新评论
发表评论
-
解析txt,BufferedReader不读取最后一行数据
2014-12-02 11:21 21341. BufferedReader br = new Bu ... -
Unsupported major.minor version 51.0原因及解决
2014-12-01 16:01 771Eclipse开始配置的是JDK1.7,后来,根据需求,改 ... -
Java的double的精度问题以及解决方案
2014-11-19 23:16 2981// 在java中,使用double进行运算,有时会出现精度 ... -
如何保证线程安全
2014-07-18 16:09 352http://sdywcd.iteye.com/blog/18 ... -
J2EE规范
2014-07-18 15:58 508转自:http://blog.csdn.net/lovesum ... -
java的JMX
2014-06-13 11:38 509http://www.cnblogs.com/itech/ar ... -
java.net.SocketTimeoutException: Read timed out
2014-05-27 15:07 9281.设置时限 httpConn.setReadTimeou ... -
Oracle官方并发教程
2014-05-27 14:48 426参见:http://ifeve.com/oracle-java ... -
java发送http请求
2014-04-24 17:25 639源自此:http://www.oschina.net/cod ... -
jdk环境配置【亲测可用】
2014-03-13 11:26 5981.安装JDK 安装过程中会出现两次 安装提示 。第一次 ... -
svn 导入的 web项目图标不对且不能部署
2014-02-07 14:10 947把本地项目右键--》Team-->share proj ... -
JSP 方面知识点
2014-01-16 17:20 3561.jsp的动作 jsp:include:在页面被请求的 ... -
java switch用法小结
2014-01-09 17:17 499// 3.用枚举 public enum sex { ... -
JAVA中一维数组,二维数组,三维数组
2013-12-12 09:55 21961、数组: 相同数据的集合。 1.1、定义数组的方法: ... -
hashmap中赋值问题,存取问题
2013-12-09 14:09 2084参考:http://hi.baidu.com/ ... -
JSTL与EL 详细说明
2013-12-06 10:48 1380首先,此文参考了以下文章: http://ecourse ... -
运算符的优先级别及结合性
2013-12-03 15:06 651当在一个表达式中存在多个运算符进行混合运算时,会根据运算符 ... -
multipart/form-data和application/x-www-form-urlencoded的区别
2013-12-03 11:12 1190FORM元素的enctype属性指定了表单数据向服务器提交时 ... -
使用URLDecoder和URLEncoder对中文进行处理
2013-12-03 10:14 705一 URLEncoder HTML 格式编 ... -
Spring定时
2013-11-26 16:05 494spring的定时任务配置分为三个步骤: 1、定义任务 2 ...
相关推荐
在本文中,我们将深入探讨如何使用`org.apache.commons.net.ftp.FTPClient`包来实现简单的文件下载功能。这个过程涉及到几个关键步骤,包括连接到FTP服务器、登录、设置传输模式、下载文件以及断开连接。 首先,你...
标签中的"org.apache.commons.net.ftp"表明此包重点在于FTP(File Transfer Protocol)支持。FTP是一种用于在网络上进行文件传输的协议,Apache Commons Net库中的FTP组件提供了丰富的API,使得开发者可以轻松地在...
org.apache.commons.net.ftp.FTPClient包,不错,在实际项目和产品中使用过。
org.apache.commons.net.ftp的官方完整jar包 放心使用
.net.ftp.FTPClient jar ,exaple, commons-net-2.0.jar
FTP应用的jar包,主要用于java开发FTP上传下载
上传了收集的最新的 commons-io-2.4.jar 包 和 commons-net-3.3.jar 以及 FTP java调用例子。net 包是一个用于操作Internet基础协议(Finger,Whois,TFTP,Telnet,POP3,FTP,NNTP,以及SMTP)的底层API。Net包...
org.apache.commons.net.ftp.FTPClient FTP工具类,实现上传、下载、压缩到输出流下载等功能
标题"org.apache.commons.net.ftp"表明这个压缩包包含了与Apache Commons Net库中FTP相关的类和功能。描述提到“所有jar包里边都有”,这意味着你将获得完整的FTP支持,包括所有必要的依赖。 Apache Commons Net库...
5. **Apache Commons Net**: 提供了一系列与网络相关的类,如 FTP 客户端、SMTP 邮件发送、TCP 连接和 URL 处理等。这对于需要进行网络通信的应用程序非常有用。 6. **Apache Commons Codec**: 包含了多种编码和...
Apache Commons 是一个由Apache软件基金会开发的Java库项目,它提供了大量的可重用Java组件,极大地简化了开发人员的...这个"org.apache.commons.jar"包是Java开发中不可或缺的工具之一,值得下载并添加到你的项目中。
总的来说,分析和学习 "org.apache.commons" 的源码是提升Java开发技能的好方法,它可以帮助你更好地理解和应用这些广泛使用的工具类库,提高编程效率和代码质量。同时,参与开源社区,提交补丁或新功能,也是贡献...
org.apache.commons.net.ftp.parser org.apache.commons.net.io org.apache.commons.net.nntp org.apache.commons.net.ntp org.apache.commons.net.pop3 org.apache.commons.net.smtp org.apache.commons.net....
在3.3版本中,`org.apache.commons.net.ftp.FTPClient`类是实现FTP通信的核心组件。这个类提供了一系列方法,允许开发者与FTP服务器进行交互,执行如上传、下载、删除文件、创建目录等操作。 FTPClient类的主要功能...
利用org.apache.commons.net.ftp.*实现FTP批量下载,包括子目录文件
"org.apache.commons" 指的是 Apache Commons 项目下的顶级命名空间,包含了多个子模块,每个模块都专注于解决特定的问题或提供特定的功能。这个 jar 包是将这些功能集合在一起的便利工具,便于开发者集成到自己的 ...
`org.apache.commons` 是这个项目中的一个主要包,包含了各种实用工具类和组件,广泛应用于Java开发中。在Java开发中,Apache Commons 提供的功能通常可以提高代码的可读性和可维护性。 `org.apache.commons` 包含...
sun.net.ftp.FtpClient,it.sauronsoftware.ftp4j.FTPClient,org.apache.commons.net.ftp.FTPClient三种不同的方式操作FTP