- 浏览: 294152 次
- 性别:
- 来自: 上海
最新评论
-
sonichy:
可以用来设计显示隐藏文件
java中File.listFiles(FileFilter) FileFilter的使用 -
fbbobo:
ftp.voidcmd('TYPE I')
python 开发的通过FTP上传下载文件类 -
LinApex:
文件内容一次性读入,性能消耗非常大
java中对文件计算MD5 -
zlb824:
问楼主一个问题,先定位于264行,如下:OutputStrea ...
org.apache.commons.net.ftp包开发FTP客户端,实现断点续传,中文支持 -
6214832:
楼主,在Linux下搭建的服务器上上传下载没有问题,但是用xl ...
org.apache.commons.net.ftp包开发FTP客户端,实现断点续传,中文支持
利用org.apache.commons.net.ftp包实现一个简单的ftp客户端实用类。主要实现一下功能
1.支持上传下载。支持断点续传
2.支持进度汇报
3.支持对于中文目录及中文文件创建的支持。
具体请看代码,上面有详细的注释。简化版本请参见http://zhouzaibao.iteye.com/blog/342766
枚举类UploadStatus代码
public enum UploadStatus { Create_Directory_Fail, //远程服务器相应目录创建失败 Create_Directory_Success, //远程服务器闯将目录成功 Upload_New_File_Success, //上传新文件成功 Upload_New_File_Failed, //上传新文件失败 File_Exits, //文件已经存在 Remote_Bigger_Local, //远程文件大于本地文件 Upload_From_Break_Success, //断点续传成功 Upload_From_Break_Failed, //断点续传失败 Delete_Remote_Faild; //删除远程文件失败 }
枚举类DownloadStatus代码
public enum DownloadStatus { Remote_File_Noexist, //远程文件不存在 Local_Bigger_Remote, //本地文件大于远程文件 Download_From_Break_Success, //断点下载文件成功 Download_From_Break_Failed, //断点下载文件失败 Download_New_Success, //全新下载文件成功 Download_New_Failed; //全新下载文件失败 }
核心FTP代码
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 * @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(FTP.BINARY_FILE_TYPE); 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 按照Linux上的路径指定方式,支持多级目录嵌套,支持递归创建不存在的目录结构 * @return 上传结果 * @throws IOException */ public UploadStatus upload(String local,String remote) throws IOException{ //设置PassiveMode传输 ftpClient.enterLocalPassiveMode(); //设置以二进制流的方式传输 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 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 <= start){ break; } } } return status; } /** * 上传文件到服务器,新上传和断点续传 * @param remoteFile 远程文件名,在上传之前已经将服务器工作目录做了改变 * @param localFile 本地文件File句柄,绝对路径 * @param processStep 需要显示的处理进度步进值 * @param ftpClient FTPClient引用 * @return * @throws IOException */ public UploadStatus uploadFile(String remoteFile,File localFile,FTPClient ftpClient,long remoteSize) throws IOException{ UploadStatus status; //显示进度的上传 long step = localFile.length() / 100; long process = 0; long localreadbytes = 0L; RandomAccessFile raf = new RandomAccessFile(localFile,"r"); OutputStream out = ftpClient.appendFileStream(new String(remoteFile.getBytes("GBK"),"iso-8859-1")); //断点续传 if(remoteSize>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("E:\\yw.flv", "/yw.flv",5)); // System.out.println(myFtp.upload("E:\\走西口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()); } } }
评论
3 楼
h819
2009-03-13
zhouzaibao 写道
这两个包其实就是我写的一个枚举的类,标记上传和下载状态中的一些异常,可以自己写一个枚举类。是最新的2.0的包。
楼主把那两个类也拿出来吧,想测试一下
2 楼
zhouzaibao
2009-03-11
这两个包其实就是我写的一个枚举的类,标记上传和下载状态中的一些异常,可以自己写一个枚举类。
是最新的2.0的包。
是最新的2.0的包。
1 楼
h819
2009-03-10
open.mis.data.DownloadStatus
open.mis.data.UploadStatus
两个包类在哪里?
另外,是否根据最新的 commons net 2.0 改写过了?
open.mis.data.UploadStatus
两个包类在哪里?
另外,是否根据最新的 commons net 2.0 改写过了?
发表评论
-
jconsole连接远程resin应用
2010-06-02 15:16 3542最近做一个web服务 ... -
log4j中配置将日志打印到不同的文件
2009-12-29 15:53 5727原文出处: http://hi.baidu.com/sihi ... -
java中GMT时间转换为long类型
2009-06-09 11:33 5899计算机世界当中的时间这里我也没有搞明白 ,如果希望搞明 ... -
java程序命令行启动方法
2009-05-06 10:07 7885刚开始学习java的朋友一定很想知道除了在IDE中点击 ... -
java开发FTP客户端列出指定目录下面所有文件
2009-04-07 17:09 14111利用commons2.0(http://commons ... -
commons2.0FTP组件开发上传时间过长程序假死解决方案
2009-03-24 15:50 4790在我前一篇blog中http://zhouzaibao ... -
使用apache commons 2.0 net组件开发ftp上传大文件使程序假死
2009-03-21 10:21 2548最近使用apache上面的commons 2.0开发 ... -
获得字符串表示的布尔表达式的值
2009-03-20 11:56 1466在实际的开发中有些时候需要计算字符串表示的布尔表达式的 ... -
java在一行固定输出,比如在一行打印进度
2009-03-13 18:36 9806在java中要实现在控制台一行中定点输出,因为我想实现 ... -
java读取控制台输入
2009-03-13 17:41 3363java中获得控制台输入不是很方便,只从1.5版本后才 ... -
java中File.listFiles(FileFilter) FileFilter的使用
2009-03-11 18:28 25763在我们调用java库中的File.listFiles( ... -
jdom结合xpath读取xml数据内容
2009-03-09 16:43 2180上次说到如果XML文件的层次比较多,直接通过 ... -
java环境变量及ant环境变量设置
2009-03-05 15:14 4281在eclipse中运行java程序有些时候确实不爽,比较喜欢的 ... -
java中对文件计算MD5
2009-03-05 14:42 7355import java.io.File; import jav ... -
java中ftp断点上传功能的实现
2009-03-04 11:14 14698主要使用apache中的net包来实现。网址http: ... -
重定向printStackTree的输出到字符串
2009-02-24 18:16 2059在实际的开发为了捕获异常,经常需要使用try{}catch{} ... -
log4j使用指南
2009-01-09 17:12 1121Log4J的配置文件(Configurat ... -
java中处理文件相关
2008-11-28 14:48 8301.使用缓冲区打开文件读。 BufferedReade ... -
关闭使用httpclient中过多日志
2008-11-22 13:17 11024在使用httpclient建立http连接的过程中,默 ... -
个人总结Java中需要注意的问题(不断补充中)
2008-11-20 21:44 1029其实这些东西估计大家都知道,将我遇到的问题整理一下。 1.字符 ...
相关推荐
此外,`org.apache.commons.net.ftp`库(如`FTPClient`和`FTP pymysql`)提供了更高级的FTP功能,如文件上传、下载、目录操作等,使得开发更为便捷。 3. 多线程技术: 为了提高文件传输效率,该项目可能采用了多...
标题"XuChuanFTP_Java_FTP断点续传"可能是指一个Java实现的FTP客户端库或者一个示例项目,专注于支持FTP的断点续传功能。这个项目可能是为了帮助开发者更方便地处理大文件的上传任务,尤其是在网络不稳定的情况下。 ...
import org.apache.commons.net.ftp.FTPClient; public class FtpClientExample { public static void main(String[] args) { FTPClient client = new FTPClient(); try { // 连接到FTP服务器 client.connect...
本文将深入探讨如何使用Java实现FTP断点续传,并提供相关的源码整理。 FTP断点续传的核心原理是通过FTP协议中的REST(Restart)命令来实现。REST命令告诉服务器从指定的位置开始继续传输数据,而不是重新开始。在...
在Java中,我们可以使用`java.net`包中的`Socket`类来实现基本的FTP功能,但更常见的是使用Apache Commons Net库,它提供了更丰富的FTP功能,包括多线程和断点续传。 FTP服务器是运行FTP服务的计算机,它存储着可供...
1. **FTP协议实现**:Apache Commons Net包含了一个完整的FTP客户端库,支持主动和被动模式,断点续传,FTP上传和下载,以及FTP服务器的命令交互。源码中`org.apache.commons.net.ftp`包下的类,如`FTP`、`FTPClient...
`java.io`包中的流类来处理数据传输,同时为了方便地处理FTP命令,可以使用`org.apache.commons.net.ftp`库,它是Apache Commons Net的一部分,提供了丰富的FTP客户端功能。 1. **FTP协议基础**: FTP协议基于TCP/...
Java的`org.apache.commons.net.ftp.FTPClient`库提供了这两种模式的支持。 4. **文件传输**:Java FTP客户端支持ASCII和二进制模式的文件传输。ASCII模式适用于文本文件,而二进制模式适用于所有其他类型的文件,...
在这个Java FTP项目中,我们关注的是如何实现FTP的断点续传功能,以及如何利用Java进行多线程FTP上传。 断点续传是FTP的一个重要特性,它允许在文件传输中断后从上次停止的地方继续,而不是重新开始整个文件的传输...
Java Apache FTP断点续传是一种在Java编程中实现FTP(文件传输协议)功能的重要技术,特别是在大文件传输时,能够提高效率并节省网络资源。Apache Commons Net是Java库,提供了丰富的FTP客户端功能,包括断点续传。...
在Android平台上实现FTP断点续传下载功能,可以极大地提高用户下载大文件的效率和体验。断点续传允许应用程序在文件下载中断后从上次停止的地方继续,而不是重新开始整个下载过程。以下是对这一主题的详细阐述: 1....
总结,Java FTP上传下载及断点续传是Java开发中常见且实用的技术,通过Apache Commons Net库可以方便地实现这些功能。在实际应用中,需要考虑网络环境、文件权限、错误处理等因素,以确保文件传输的稳定性和可靠性。
import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; public class FtpUploader { public static void main(String[] args) { ...
Ftp4j提供了一个完整的FTP客户端实现,包括基本的文件操作和更高级的功能,如断点续传、多线程下载、文件列表解析等。其API简洁且灵活,允许开发者根据需求自定义各种行为。Ftp4j还支持FTPS(FTP over TLS/SSL)和...
这个版本(3.3)提供了对FTP协议的新特性和优化,比如支持TLS/SSL加密连接,断点续传,以及更完善的错误处理机制。 `mina-core-2.0.4.jar`是Apache MINA库,它是一个网络应用框架,专注于简化异步I/O编程,尤其适用...
Java FTP多线程批量断点续传是一种在Java编程中实现高效、稳定文件传输的方法,尤其适用于大文件的上传和下载。在这个过程中,我们利用FTP(File Transfer Protocol)协议,结合多线程技术和断点续传功能,可以显著...
Java 实现 FTP 断点续传是一项常见的...总的来说,实现Java中的FTP断点续传涉及理解FTP协议,使用适当的库,以及处理可能出现的网络和文件系统问题。在开发过程中,注意错误处理和性能优化,确保功能的稳定性和效率。
1. **Java FTPClient库**: 如Apache Commons Net中的`FTPClient`类,提供了丰富的API来实现FTP客户端功能,如连接服务器、登录、上传/下载文件、断点续传等。 2. **连接管理**: 客户端需要正确管理FTP连接,包括...
### Java实现FTP多线程断点续传:深入解析与技术要点 在现代软件开发中,数据传输是一项基本且关键的任务,特别是在处理...通过理解并应用上述关键技术点,开发者可以在自己的项目中实现高效、稳定的FTP断点续传功能。
Commons Net 支持 FTP、FTPS (FTP over SSL/TLS) 和 SFTP (SSH File Transfer Protocol) 协议,提供了一套完善的 API 来处理文件传输、文件列表、断点续传等功能。 3. **使用 JSch 库**: 如果需要支持 SFTP,...