- 浏览: 347349 次
- 来自: 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 2047打上SOLR-236_collapsing.patch补丁, ... -
Apache Solr schema.xml及solrconfig.xml文件中文注解
2011-11-04 20:39 1985schema.xml位于solr/conf/目录下,类似于数据 ... -
自定义评分器Similarity提高搜索体验
2011-11-04 20:35 2094http://www.gbsou.com/2011/11/01 ... -
Solr的扩展(Scaling)以及性能调优
2011-11-04 20:16 3203当你的索引数量越来 ... -
lucene下的contrib包介绍
2010-09-10 18:23 2513analyzers 下分为两个包 ... -
构建可伸缩,高性能的互联网应用(copy from http://yuquan-nana.javaeye.com/blog/710302)
2010-07-12 13:31 1999时间过得很快,来淘宝已经两个月了,在这两个月的时间里,自己也感 ... -
ImageMagick, JMagick安装、配置(windows版)
2009-09-29 21:55 5442ImageMagick, JMagick安装、配置(windo ... -
使用HttpClient4.0调用JavaEye API
2009-09-19 21:22 2502package com.javaeye.client; ... -
Java的Excel报表开源工具
2008-12-24 20:25 2479http://jdkcn.com/entry/opensour ... -
Apache Commons工具集简介
2008-12-09 12:11 1957Commons BeanUtils http://jakart ... -
Apache开源项目分类列表
2008-11-03 16:41 2215分类 项目名 说明 开发语言 服务器 ... -
JDK5多线程框架java.util.concurrent
2008-10-30 17:59 3848JDK5中的一个亮点就是将Doug Lea的并发库引入到Jav ... -
Java处理图片
2008-10-05 13:08 2182图片上传到服务器后,会根据情况将图片缩小成一个图标,我们可以利 ... -
XFire 入门
2008-09-11 15:17 1153http://www.ibm.com/developerwor ...
相关推荐
此外,`org.apache.commons.net.ftp`库(如`FTPClient`和`FTP pymysql`)提供了更高级的FTP功能,如文件上传、下载、目录操作等,使得开发更为便捷。 3. 多线程技术: 为了提高文件传输效率,该项目可能采用了多...
2. **Telnet协议实现**:`org.apache.commons.net.telnet`包提供了Telnet客户端的实现,允许用户与远程主机进行交互。你可以通过`TelnetClient`类来学习如何建立和管理Telnet连接。 3. **NNTP协议实现**:`org....
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) { ...
`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断点续传的核心原理是通过FTP协议中的REST(Restart)命令来实现。REST命令告诉服务器从指定的位置开始继续传输数据,而不是重新开始。在...
Java 实现 FTP (File Transfer Protocol) 通常涉及使用 FTP 客户端库来与FTP服务器进行交互,以完成文件的上传、下载、删除等操作。本文将介绍几种使用 Java 实现 FTP 的方法,重点关注第三方库的使用。 1. **使用 ...
1. **Java FTPClient库**: 如Apache Commons Net中的`FTPClient`类,提供了丰富的API来实现FTP客户端功能,如连接服务器、登录、上传/下载文件、断点续传等。 2. **连接管理**: 客户端需要正确管理FTP连接,包括...
Ftp4j提供了一个完整的FTP客户端实现,包括基本的文件操作和更高级的功能,如断点续传、多线程下载、文件列表解析等。其API简洁且灵活,允许开发者根据需求自定义各种行为。Ftp4j还支持FTPS(FTP over TLS/SSL)和...
此外,Java还提供了一个名为`org.apache.commons.net.ftp`的第三方库,它简化了FTP客户端和服务端的开发。这个库包含了FTPClient和FTPServer类,提供了许多预定义的方法来处理FTP操作,如登录、上传、下载、删除文件...
Apache FTP开发包是一个用于构建FTP(文件传输协议)客户端和服务端应用的软件包,主要基于Apache Commons Net库。这个开发包包含了多个相关的组件和库,为开发者提供了在Java环境中实现FTP功能的强大支持。 Apache...
在Java中,`org.apache.commons.net.ftp`库提供了FTPClient类,它简化了与FTP服务器的交互。要创建一个FTP客户端,首先需要导入相关库并创建FTPClient实例: ```java import org.apache.commons.net.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...
标题"XuChuanFTP_Java_FTP断点续传"可能是指一个Java实现的FTP客户端库或者一个示例项目,专注于支持FTP的断点续传功能。这个项目可能是为了帮助开发者更方便地处理大文件的上传任务,尤其是在网络不稳定的情况下。 ...
FTP(File Transfer Protocol)文件传输协议是互联网上用于在不同计算机之间交换...通过Apache Commons Net等第三方库,开发人员可以轻松实现复杂的FTP操作,如断点续传、文件权限设置等,从而满足各种文件传输需求。
在这个资料包中,你将找到使用Apache Commons Net进行FTP断点续传的相关资料和实例,以及可能包含MyEclipse 9.0的开发环境配置和FileZilla服务器的设置指南。 Apache Commons Net库提供了FTPClient类,它是Java实现...
import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPFile; import org.apache....
1. **FTP客户端**:提供了全面的FTP客户端功能,包括文件的上传、下载、删除、重命名,目录操作,以及断点续传。 2. **FTPS**:支持FTP over SSL/TLS,增强了文件传输的安全性。 3. **TFTP**:简单文件传输协议...
在Java中,我们可以使用`java.net`包中的`Socket`类来实现基本的FTP功能,但更常见的是使用Apache Commons Net库,它提供了更丰富的FTP功能,包括多线程和断点续传。 FTP服务器是运行FTP服务的计算机,它存储着可供...
import org.apache.commons.net.ftp.*; FTPClient client = new FTPClient(); try { client.connect("ftp.server.com"); client.login("username", "password"); client.setFileType(FTP.BINARY_FILE_TYPE); ...