java FTP 工具类 同步文件夹 下载文件..等操作(FtpHelper 需要commons-net-3.5.jar)

package com.esb.component;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPFileFilter;
import org.apache.commons.net.ftp.FTPReply;
/*import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
*/
public class FtpHelper {

private FTPClient ftp = null;
/**
* Ftp服务器
*/
private String server;
/**
* 用户名
*/
private String uname;
/**
* 密码
*/
private String password;
/**
* 连接端口,默认21
*/
private int port = 21;

//private Document document ;

public FtpHelper(String server, int port, String uname,
String password){
this.server = server;
if (this.port > 0){
this.port = port;
}
this.uname = uname;
this.password = password;
//初始化
ftp = new FTPClient();

}
/**
* 连接FTP服务器

* @param server
* @param uname
* @param password
* @return
* @throws Exception
*/
public FTPClient connectFTPServer() throws Exception {
try {
ftp.setControlEncoding("GBK");
//ftp.setControlEncoding("UTF-8");

ftp.configure(getFTPClientConfig());
ftp.connect(this.server, this.port);
if (!ftp.login(this.uname, this.password)) {
ftp.logout();
ftp = null;
return ftp;
}

// 文件类型,默认是ASCII
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

// 设置被动模式
ftp.enterLocalPassiveMode();
ftp.setConnectTimeout(10000);
ftp.setBufferSize(1024);
// 响应信息
int replyCode = ftp.getReplyCode();
if ((!FTPReply.isPositiveCompletion(replyCode))) {
// 关闭Ftp连接
closeFTPClient();
// 释放空间
ftp = null;
throw new Exception("登录FTP服务器失败,请检查![Server:" + server + "、"
+ "User:" + uname + "、" + "Password:" + password);
} else {
return ftp;
}
} catch (Exception e) {
ftp.disconnect();
ftp = null;
throw e;
}
}

/**
* 配置FTP连接参数

* @return
* @throws Exception
*/
public FTPClientConfig getFTPClientConfig() throws Exception {
String systemKey = FTPClientConfig.SYST_UNIX;//FTPClientConfig.SYST_NT;
String serverLanguageCode = "zh";
FTPClientConfig conf = new FTPClientConfig(systemKey);
conf.setServerLanguageCode(serverLanguageCode);
conf.setDefaultDateFormatStr("yyyy-MM-dd");
return conf;
}

/**
* 向FTP根目录上传文件

* @param localFile
* @param newName
*            新文件名
* @throws Exception
*/
public Boolean uploadFile(String localFile, String newName)
throws Exception {
InputStream input = null;
boolean success = false;
try {
File file = null;
if (checkFileExist(localFile)) {
file = new File(localFile);
}
input = new FileInputStream(file);
success = ftp.storeFile(newName, input);
if (!success) {
throw new Exception("文件上传失败!");
}
} catch (Exception e) {
throw e;
} finally {
if (input != null) {
input.close();
}
}
return success;
}

/**
* 向FTP根目录上传文件

* @param input
* @param newName
*            新文件名
* @throws Exception
*/
public Boolean uploadFile(InputStream input, String newName)
throws Exception {
boolean success = false;
try {
success = ftp.storeFile(newName, input);
if (!success) {
throw new Exception("文件上传失败!");
}
} catch (Exception e) {
throw e;
} finally {
if (input != null) {
input.close();
}
}
return success;
}

/**
* 向FTP指定路径上传文件

* @param localFile
* @param newName
*            新文件名
* @param remoteFoldPath
* @throws Exception
*/
public Boolean uploadFile(String localFile, String newName,
String remoteFoldPath) throws Exception {

InputStream input = null;
boolean success = false;
try {
File file = null;
if (checkFileExist(localFile)) {
file = new File(localFile);
}
input = new FileInputStream(file);

// 改变当前路径到指定路径
if (!this.changeDirectory(remoteFoldPath)) {
System.out.println("服务器路径不存!");
return false;
}
success = ftp.storeFile(newName, input);
if (!success) {
throw new Exception("文件上传失败!");
}
} catch (Exception e) {
throw e;
} finally {
if (input != null) {
input.close();
}
}
return success;
}

/**
* 向FTP指定路径上传文件

* @param input
* @param newName
*            新文件名
* @param remoteFoldPath
* @throws Exception
*/
public Boolean uploadFile(InputStream input, String newName,
String remoteFoldPath) throws Exception {
boolean success = false;
try {
// 改变当前路径到指定路径
if (!this.changeDirectory(remoteFoldPath)) {
System.out.println("服务器路径不存!");
return false;
}
success = ftp.storeFile(newName, input);
if (!success) {
throw new Exception("文件上传失败!");
}
} catch (Exception e) {
throw e;
} finally {
if (input != null) {
input.close();
}
}
return success;
}
/**
* 从FTP服务器下载文件

* @param remotePath
*            FTP路径(不包含文件名)
* @param fileName
*            下载文件名
* @param localPath
*            本地路径
*/
public Boolean downloadFile(String remotePath, String fileName,
String localPath) throws Exception {
Date begin=new Date();
BufferedOutputStream output = null;
boolean success = false;
try {
File dir =new File(localPath);
if(!dir.exists())
dir.mkdirs();

// 检查本地路径
this.checkFileExist(localPath);
// 改变工作路径
if (!this.changeDirectory(remotePath)) {
System.out.println("当前路径 "+ftp.printWorkingDirectory()+" 服务器路径"+remotePath+"不存在");
return false;
}
// 列出当前工作路径下的文件列表
List<FTPFile> fileList = this.getFileList();
if (fileList == null || fileList.size() == 0) {
System.out.println("服务器当前路径下不存在文件!");
return success;
}

File localFilePath = new File(localPath + File.separator
+ fileName);
output = new BufferedOutputStream(new FileOutputStream(
localFilePath));
success = ftp.retrieveFile(fileName, output);
if(!success){
System.err.println("文件下载失败:"+remotePath+" "+fileName);
}else{
System.out.println("下载成功 (耗时:"+(System.currentTimeMillis()-begin.getTime())/1000d+" s):"+remotePath+"/"+fileName+"-> "+localPath+"/"+fileName);
}

/*for (FTPFile ftpfile : fileList) {
String ftpFileName=ftpfile.getName();
if (ftpFileName.equals(fileName)) {
File localFilePath = new File(localPath + File.separator
+ ftpFileName);
output = new BufferedOutputStream(new FileOutputStream(
localFilePath));
success = ftp.retrieveFile(ftpFileName, output);
if(!success){
System.err.println("文件下载失败:"+remotePath+" "+fileName);
}
}else{
System.err.println("ftpFileName.equals(fileName) 不匹配 "+ftpFileName+" "+fileName);
}
}*/
/*if (!success) {
throw new Exception("文件下载失败!");
}*/
} catch (Exception e) {
throw e;
} finally {
if (output != null) {
output.close();
}
}
return success;
}

/**
* 从FTP服务器获取文件流

* @param remoteFilePath
* @return
* @throws Exception
*/
public InputStream downloadFile(String remoteFilePath) throws Exception {

return ftp.retrieveFileStream(remoteFilePath);
}

/**
* 获取FTP服务器上指定路径下的文件列表

* @param filePath
* @return
*/
/*
public List<FTPFile> getFtpServerFileList(String remotePath)
throws Exception {

FTPListParseEngine engine = ftp.initiateListParsing(remotePath);
List<FTPFile> ftpfiles = Arrays.asList(engine.getNext(25));

return ftpfiles;
}*/

/**
* 获取FTP服务器上[指定路径]下的文件列表

* @param path
* @return
* @throws Exception
*/
public List<FTPFile> getFileList(String remotePath) throws Exception {
if(remotePath!=null && !remotePath.endsWith("/")){
remotePath+="/";
}
List<FTPFile> ftpfiles = Arrays.asList(ftp.listFiles(remotePath,new FTPFileFilter() {
@Override
public boolean accept(FTPFile f) {
/*if(remotePath2!=null && remotePath2.equals(f.getName()) && f.getType()==FTPFile.DIRECTORY_TYPE){
return false;
}*/
if(".".equals(f.getName()) || "..".equals(f.getName())){
return false;
}
return true;
}
}));

return ftpfiles;
}

/**
* 获取FTP服务器[当前工作路径]下的文件列表

* @param path
* @return
* @throws Exception
*/
public List<FTPFile> getFileList() throws Exception {

List<FTPFile> ftpfiles = Arrays.asList(ftp.listFiles(null,new FTPFileFilter() {
@Override
public boolean accept(FTPFile f) {
if(!".".equals(f.getName()) && !"..".equals(f.getName())){
return true;
}
return false;
}
}));

return ftpfiles;
}

/**
* 改变FTP服务器工作路径 

* @param remoteFoldPath
*/
public Boolean changeDirectory(String remoteFoldPath) throws Exception {

return ftp.changeWorkingDirectory(remoteFoldPath);
}

/**
* 删除文件

* @param remoteFilePath
* @return
* @throws Exception
*/
public Boolean deleteFtpServerFile(String remoteFilePath) throws Exception {

return ftp.deleteFile(remoteFilePath);
}

/**
* 创建目录

* @param remoteFoldPath
* @return
*/
public boolean createFold(String remoteFoldPath) throws Exception {

boolean flag = ftp.makeDirectory(remoteFoldPath);
if (!flag) {
throw new Exception("创建目录失败");
}
return false;
}

/**
* 删除目录
* @param remoteFoldPath
* @return
* @throws Exception
*/
public boolean deleteFold(String remoteFoldPath) throws Exception {

return ftp.removeDirectory(remoteFoldPath) ;
}

/**
* 删除目录以及文件

* @param remoteFoldPath
* @return
*/
public boolean deleteFoldAndsubFiles(String remoteFoldPath)
throws Exception {

boolean success = false;
List<FTPFile> list = this.getFileList(remoteFoldPath);
if (list == null || list.size() == 0) {
return deleteFold(remoteFoldPath);
}
for (FTPFile ftpFile : list) {

String name = ftpFile.getName();
if (ftpFile.isDirectory()) {
success = deleteFoldAndsubFiles(remoteFoldPath + "/" + name);
if (!success)
break;
} else {
success = deleteFtpServerFile(remoteFoldPath + "/" + name);
if (!success)
break;
}
}
if (!success)
return false;
success = deleteFold(remoteFoldPath);
return success;
}

/**
* 检查本地路径是否存在

* @param filePath
* @return
* @throws Exception
*/
public boolean checkFileExist(String filePath) throws Exception {
boolean flag = false;
File file = new File(filePath);
if (!file.exists()) {
throw new Exception("本地路径不存在,请检查!");
} else {
flag = true;
}
return flag;
}

/**
* 创建XML文件
* @return
*/
/*public Element getCurrentElement(){
document = DocumentHelper.createDocument();
return document.addElement("root");
}*/

/**
* 生成目录XML文件
*/
/*public void createDirectoryXML(String remotePath,Element fatherElement) throws Exception{

List<FTPFile> list = this.getFileList();
for(FTPFile ftpfile:list){
Element currentElement = fatherElement; //当前的目录节点
String newRemotePath = remotePath+ftpfile.getName();
if(ftpfile.isDirectory()){
Element dirElement = fatherElement.addElement("dir") ;
dirElement.addAttribute("name",ftpfile.getName());
currentElement = dirElement;
this.changeDirectory(newRemotePath); //从根目录开始
createDirectoryXML(newRemotePath,dirElement);
}else{
Element fileElement = fatherElement.addElement("file");//文件节点
fileElement.setText(ftpfile.getName()) ;
}
}
}*/

/**
* 保存xml
*/
/*public void saveXML(){
XMLWriter output = new XMLWriter();
        //输出格式化
        OutputFormat format = OutputFormat.createPrettyPrint();
        try {
            output = new XMLWriter(new FileWriter("src/com/shine/Ftp/config/dir.xml"), format);
            output.write(this.document);
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
}*/

/**
* 关闭FTP连接

* @param ftp
* @throws Exception
*/
public void closeFTPClient(FTPClient ftp) throws Exception {

try {
if (ftp.isConnected())
ftp.logout();
ftp.disconnect();
} catch (Exception e) {
throw new Exception("关闭FTP服务出错!");
}
}

/**
* 关闭FTP连接

* @throws Exception
*/
public void closeFTPClient() throws Exception {

this.closeFTPClient(this.ftp);
}

/**
* Get Attribute Method

*/
public FTPClient getFtp() {
return ftp;
}

public String getServer() {
return server;
}

public String getUname() {
return uname;
}

public String getPassword() {
return password;
}

public int getPort() {
return port;
}

/**
* Set Attribute Method

*/
public void setFtp(FTPClient ftp) {
this.ftp = ftp;
}

public void setServer(String server) {
this.server = server;
}

public void setUname(String uname) {
this.uname = uname;
}

public void setPassword(String password) {
this.password = password;
}

public void setPort(int port) {
this.port = port;
}

public int synFtpFolder(String remotePath,String localPath) throws Exception{
if(remotePath==null){
remotePath="/";
}else if(!remotePath.startsWith("/")){
remotePath="/"+remotePath;
}

List<FTPFile> lst=getFileList(remotePath);
int fileCount=0;
System.out.println("同步文件夹:" +remotePath+" "+lst.size());
for(int i=0;i<lst.size();i++){
FTPFile f=lst.get(i);
if(f.getType()==FTPFile.DIRECTORY_TYPE){
fileCount+=synFtpFolder((remotePath=="/"?"":remotePath)+"/"+f.getName(),localPath+"/"+f.getName());
}else if(f.getType()==FTPFile.FILE_TYPE){
System.out.println("同步文件:"+remotePath+"/"+f.getName()+"  ");
File dir=new File(localPath);
if(!dir.exists()){
dir.mkdirs();
}

downloadFile(remotePath, f.getName(), localPath);
fileCount++;
}else{
System.out.println("ftp文件 特殊类型"+f.getType());
}
}
return fileCount;
}
public List<FTPFile> getAllFiles(String remotePath) throws Exception{
Date begin=new Date();
if(remotePath==null){
remotePath="/";
}else if(!remotePath.startsWith("/")){
remotePath="/"+remotePath;
}
List<FTPFile> files=new ArrayList<>();
List<FTPFile> lst=getFileList(remotePath);
for(int i=0;i<lst.size();i++){
FTPFile f=lst.get(i);
if(f.getType()==FTPFile.DIRECTORY_TYPE){
files.addAll(getAllFiles((remotePath=="/"?"":remotePath)+"/"+f.getName()));
}else if(f.getType()==FTPFile.FILE_TYPE){
files.add(f);
}else{
System.out.println("ftp文件 特殊类型"+f.getType());
}
}
System.out.println("遍历"+remotePath+" 耗时 "+(System.currentTimeMillis()-begin.getTime())/1000d+" s");
return files;
}
/**
* 主方法(测试)

* 问题:上传时命名的新文件名不能有中文,否则上传失败.

* @param args
* @throws Exception 
*/
public static void main(String[] args) throws Exception {
/*try {
FtpHelper fu = new FtpHelper("192.168.2.18", 21, "administrator","sunshine");
fu.connectFTPServer();
Element fatherElement = fu.getCurrentElement();
fu.createDirectoryXML("/", fatherElement);
fu.saveXML();
} catch (Exception e) {
System.out.println("异常信息:" + e.getMessage());
}*/

FtpHelper fu = new FtpHelper("192.168.1.137", 88, "HoPacs","cnhis");
//FtpHelper fu = new FtpHelper("192.168.1.213", 88, "martin","martin");
fu.connectFTPServer();

//fu.do"ftp://HoPacs:cnhis@192.168.1.137:88/RisImgDir/2016-06-21/US0000000001/US0000000001.jpg"

/*fu.changeDirectory("RisImgDir/2013-11-27/US0000000013");

List<FTPFile> lst=fu.getFileList();
System.out.println(lst.size());
for(int i=0;i<lst.size();i++){
FTPFile f=lst.get(i);

System.out.println("类型:"+f.getType()+"  "+f);
if(f.getType()==FTPFile.DIRECTORY_TYPE){

}else if(f.getType()==FTPFile.FILE_TYPE){
fu.downloadFile("/RisImgDir/2013-11-27/US0000000013", f.getName(), "D:/workspace/testFTP/ftp");
}else{
System.out.println("ftp文件 特殊类型"+f.getType());
}
}*/

//同步文件夹
/* 
int count=fu.synFtpFolder("/2015-08-18","D:/workspace/testFTP/ftp");
System.out.println("文件同步总数量"+count);*/

//遍历根目录
List<FTPFile> allFiles=fu.getAllFiles(null);
for(FTPFile f: allFiles){
System.out.println(f.getName()+" "+(f.getTimestamp()==null?null:f.getTimestamp().getTime().toLocaleString()));
}

//fu.downloadFile("/test","《技术服务部制度》修订版V1.4.pdf","D:/workspace/testFTP/ftp/localftp") ;

//fu.downloadFile("/21877","《技术服务部制度》修订版V1.4.pdf","D:/workspace/testFTP/ftp") ;

/*for(FTPFile f: fu.getFileList("/21877")){
System.out.println(f.getName());
}*/

/*fu.changeDirectory("/2012-07-11/US0000000009");
System.out.println(fu.getFileList("/").size());*/

/*fu.changeDirectory("/2012-07-11/US0000000009");
boolean b=fu.changeDirectory("/2012-07-11/US0000000009");
System.out.println("存在目录? "+b);*/

fu.closeFTPClient();
}
}

时间: 2024-10-13 03:14:14

java FTP 工具类 同步文件夹 下载文件..等操作(FtpHelper 需要commons-net-3.5.jar)的相关文章

flashfxp怎么下载文件 flashfxp下载文件教程图

  flashfxp怎么下载文件?flashfxp是一款很好用的ftp管理工具,是每个网站程序猿必不可缺少的工具.下面,绿茶小乐哥就为大家带来flashfxp下载文件教程图解,希望能帮到大家! flashfxp集成了其他优秀的FTP工具的优点,是一款很不错的FTP工具. flashfxp下载文件方法介绍: 1.首先我们打开flashfxp工具,然后我们用鼠标单击回话菜单,选择"快速连接" 2.进入快速连接窗口,输入地址,账户,密码,地址,可以是域名或ip输入完后,单击连接.成功连接,并

Java获取文件大小,文件夹内文件个数的工具类

package cn.edu.hactcm.cfcms.utils; import java.io.File;import java.io.FileInputStream;import java.text.DecimalFormat;/**  * CFMS    :Computer files management system   * version :1.0 2013-3-2 下午03:33:07 */public class FileInfoUtils {  /**  * 获得文件类型(文

java常用工具类之Excel操作类及依赖包下载_java

依赖包下载:http://xiazai.jb51.net/201407/tools/java-excel-dependency(jb51.net).rar Excel工具类ExcelUtil.java源码: package com.itjh.javaUtil; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStr

sftp和ftp 根据配置远程服务器地址下载文件到当前服务_java

废话不多说,关键代码如下所示:   package com.eastrobot.remote; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com

操作文件夹或文件的权限的命令行工具Icacls

  在Windows Vista和Windows Server 2003 Service Pack 2中,微软提供了一个新的命令行工具Icacls,你可以使用它来查看.设置.保存并恢复文件夹或文件的权限.它在功能上比以往的Cacls更为强大. ICACLS name /save aclfile [/T] [/C] [/L] [/Q] 将所有匹配名称的 ACL 存储到 aclfile 中以便将来用于 /restore. ICACLS directory [/substitute SidOld Si

在ASP.NET的页面中显示FTP中的文件夹和文件信息

问题描述 那位兄弟,在ASP.NET做过这种效果,连接FTP并把FTP上的第一层的文件夹或文件显示在ASP.NET的页面上,然后单击文件夹,就在页面上显示你选中的这个文件夹里面一层的文件夹或文件信息,单击文件的话就直接打开文件,还能返回上层文件夹的功能.最好还能过滤文件的类型.我对FTP不是很了解,无法下手.那位可以给点建议.谢了. 解决方案 解决方案二:参考http://blog.csdn.net/downmoon/archive/2008/01/29/2071776.aspxhttp://w

php 文件夹与文件移动类

这是一个文件目录移动类,只要在listDir写你的要转移文件的目录名移就可以了,这个文件夹与文件移动类,比较适合采集下载的多文件操作,如要在打包文件里面加说明,等哦. <?php教程 die();  class s{   //var $path ='flash';   var $htm ='/index.htm';   var $html='/index.html';   var $ladir='/111cn.net教程';      public function full_copy( $so

PHP遍历文件夹与文件类及处理类用法实例

  本文实例讲述了PHP遍历文件夹与文件类及处理类用法,非常具有实用价值.分享给大家供大家参考.具体方法如下: FindFile.class.php类文件用于遍历目录文件,具体代码如下: <?php /** 遍历文件夹及文件类 * Date: 2013-03-21 * Author: fdipzone * Ver: 1.0 */ class FindFile{ public $files = array(); // 存储遍历的文件 protected $maxdepth; // 搜寻深度,0表示

PHP遍历文件夹及文件类及处理类

FindFile.class.php 用于遍历目录文件 <?php /** 遍历文件夹及文件类 * Date: 2013-03-21 * Author: fdipzone * Ver: 1.0 */ class FindFile{ public $files = array(); // 存储遍历的文件 protected $maxdepth; // 搜寻深度,0表示没有限制 /* 遍历文件及文件夹 * @param String $spath 文件夹路径 * @param int $maxdep