- 浏览: 342169 次
- 来自: NA
文章分类
最新评论
-
上官车月:
实验成功,转载了
Java获取请求客户端的真实IP地址 -
url_nc:
very good
css教程–十步学会用css建站(全) -
hiveer:
楼主我想问能不能不在class里面定义get_binding ...
强大的ruby模版:ERB -
ilovebaby0530:
修改密码后需要 FLUSH PRIVILEGES;
绿色版mysql安装步骤 -
albrich:
你这个方法也是不行的,得到的仍然是内网的IP
Java获取请求客户端的真实IP地址
利用org.apache.commons.net.ftp包实现一个简单的ftp客户端实用类。主要实现一下功能
1.支持上传下载。支持断点续传
2.支持进度汇报
3.支持对于中文目录及中文文件创建的支持。
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 http://www.bt285.cn
* @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或是 http://www.guihua.org /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(remoteFile
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 http://www.bt285.cn
* @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或是 http://www.guihua.org /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(remoteFile
评论
4 楼
johnnyhg
2009-06-11
可以,我再找找。
3 楼
gousheng12345
2009-06-10
其实上传也有不能重复调用upload函数()这个问题哈
2 楼
gousheng12345
2009-06-10
楼主你好,请问为什么我的main函数写成这个样
public static void main(String[] args) {
JContinueFTPUtil myFtp = new JContinueFTPUtil();
System.out.println("第一次");
try
{
myFtp.connect("127.0.0.1", 21, "gou", "gou");
System.out.println(myFtp.download("("/央视走西口/新浪网/走西口24.mp4", "D:\\走西口24.mp4"));
myFtp.disconnect();
}
catch (IOException e)
{
System.out.println("连接FTP出错:"+e.getMessage());
}
System.out.println("第二次");
try {
myFtp.connect("127.0.0.1", 21, "gou", "gou");
System.out.println(myFtp.download("/图片/地质图.jpg", "D:\\地质图.jpg"));
myFtp.disconnect();
}
catch (IOException e)
{
System.out.println("连接FTP出错:"+e.getMessage());
}
}
连续调用download烂熟的时候,第一次调用download可以正确的传输文件,第二次调用download的时候就会报 远程文件不存在 Remote_File_Noexist 这样的错误呢,我的服务器端已经有了这样的文件了。请赐教,谢谢!
public static void main(String[] args) {
JContinueFTPUtil myFtp = new JContinueFTPUtil();
System.out.println("第一次");
try
{
myFtp.connect("127.0.0.1", 21, "gou", "gou");
System.out.println(myFtp.download("("/央视走西口/新浪网/走西口24.mp4", "D:\\走西口24.mp4"));
myFtp.disconnect();
}
catch (IOException e)
{
System.out.println("连接FTP出错:"+e.getMessage());
}
System.out.println("第二次");
try {
myFtp.connect("127.0.0.1", 21, "gou", "gou");
System.out.println(myFtp.download("/图片/地质图.jpg", "D:\\地质图.jpg"));
myFtp.disconnect();
}
catch (IOException e)
{
System.out.println("连接FTP出错:"+e.getMessage());
}
}
连续调用download烂熟的时候,第一次调用download可以正确的传输文件,第二次调用download的时候就会报 远程文件不存在 Remote_File_Noexist 这样的错误呢,我的服务器端已经有了这样的文件了。请赐教,谢谢!
1 楼
qc_future521
2009-06-01
楼主贴的代码不全啊!可否继续!谢谢啦!
发表评论
-
Apache Solr 实现去掉重复的搜索结果
2011-11-04 20:40 2008打上SOLR-236_collapsing.patch补丁, ... -
Apache Solr schema.xml及solrconfig.xml文件中文注解
2011-11-04 20:39 1953schema.xml位于solr/conf/目录下,类似于数据 ... -
自定义评分器Similarity提高搜索体验
2011-11-04 20:35 2044http://www.gbsou.com/2011/11/01 ... -
Solr的扩展(Scaling)以及性能调优
2011-11-04 20:16 3117当你的索引数量越来 ... -
lucene下的contrib包介绍
2010-09-10 18:23 2465analyzers 下分为两个包 ... -
构建可伸缩,高性能的互联网应用(copy from http://yuquan-nana.javaeye.com/blog/710302)
2010-07-12 13:31 1975时间过得很快,来淘宝已经两个月了,在这两个月的时间里,自己也感 ... -
ImageMagick, JMagick安装、配置(windows版)
2009-09-29 21:55 5412ImageMagick, JMagick安装、配置(windo ... -
使用HttpClient4.0调用JavaEye API
2009-09-19 21:22 2470package com.javaeye.client; ... -
Java的Excel报表开源工具
2008-12-24 20:25 2431http://jdkcn.com/entry/opensour ... -
Apache Commons工具集简介
2008-12-09 12:11 1919Commons BeanUtils http://jakart ... -
Apache开源项目分类列表
2008-11-03 16:41 2179分类 项目名 说明 开发语言 服务器 ... -
JDK5多线程框架java.util.concurrent
2008-10-30 17:59 3801JDK5中的一个亮点就是将Doug Lea的并发库引入到Jav ... -
Java处理图片
2008-10-05 13:08 2146图片上传到服务器后,会根据情况将图片缩小成一个图标,我们可以利 ... -
XFire 入门
2008-09-11 15:17 1116http://www.ibm.com/developerwor ...
相关推荐
org.apache.commons.net.ftp.FTPClient包,不错,在实际项目和产品中使用过。
.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..包完整、干净、实用
NULL 博文链接:https://vakinge.iteye.com/blog/487486
org.apache.commons.net.ftp的官方完整jar包 放心使用
org.apache.commons.net.ftp.FTPClient FTP工具类,实现上传、下载、压缩到输出流下载等功能
org.apache.commons.lang.BitField.class org.apache.commons.lang.BooleanUtils.class org.apache.commons.lang.CharEncoding.class org.apache.commons.lang.CharRange.class org.apache.commons.lang.CharSet...
org.apache.commons.lang.BitField.class org.apache.commons.lang.BooleanUtils.class org.apache.commons.lang.CharEncoding.class org.apache.commons.lang.CharRange.class org.apache.commons.lang.CharSet...
org.apache.commons.net.util.jar
org.apache.commons.net.ftp类所需要的所有jar包 里边都有
java FTP 开发工具包 examples examples.nntp examples.ntp org.apache.commons.net org.apache.commons.net.bsd org.apache.commons.net.chargen org.apache.commons.net.daytime org.apache.commons.net....
Apache Commons Net » 3.3 org.apache.commons.net.ftp.FTPClient
import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods....
org.apache.commons.net.jar包,需要org.apache.commons.net.socketfactory包的也可以直接下这个包,它里面就有包含了
利用org.apache.commons.net.ftp.*实现FTP批量下载,包括子目录文件
org.apache.commons.commons-math3:3.6.1
org.apache.commons.beanutils.jar