import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.SocketException; 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.commons.net.ftp.FTPReply; import org.apache.log4j.Logger; import com.aspire.prm.app.iodd.common.remoteclient.RemoteClient; import com.aspire.prm.dmplt.basic.domain.FtpConfig; /** * name:FtpClient * <p> * </p> * * @author:lipeng * @data:2014-9-20 下午05:20:26 * @version 1.0 */ public class FtpClient implements RemoteClient { private FTPClient client = null; private FtpConfig config = null; private static final Logger logger = Logger.getLogger(FtpClient.class);; /** 当前工作目录,每次关闭连接要回复到null,因为当前类是单例类 */ private String workDirectory = null; /** 是否手工控制连接 */ private boolean handSwitch = false; /** true表示已经登录到ftp服务器 */ private boolean ready = false; /** * 初始化参数配置及创建commons.net.ftp的客户端 */ public FtpClient(FtpConfig config) { client = new FTPClient(); this.config = config; client.setControlEncoding(config.getRemoteEncoding()); // 设置当前工作目录 workDirectory = config.getRootPath(); } /** * 连接ftp * * @return * @throws SocketException * @throws IOException */ private boolean connect() throws SocketException, IOException { client.connect(config.getServer(), Integer.valueOf(config.getPort())); int reply; reply = client.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { client.disconnect(); logger.info("FTP server refused connection."); return false; } return true; } /** * 登入ftp * * @return * @throws IOException */ private boolean login() throws IOException { if (!client.login(config.getUsername(), config.getPassword())) { client.logout(); logger.info("FTP server login fail."); return false; } return true; } /** * 连接然后登入统一入口 * * @return * @throws SocketException * @throws IOException */ public boolean ready() throws SocketException, IOException { if (connect() && login()) { setConfig(); ready = true; return true; } return false; } /** * ftp运行环境参数配置 * * @throws IOException */ private void setConfig() throws IOException { FTPClientConfig conf = new FTPClientConfig(config.getFTPStyle()); client.configure(conf); // 被动传输模式 if (config.getPassiveMode()) client.enterLocalPassiveMode(); // 二进制传输模式 if (config.getBinaryFileType()) client.setFileType(FTP.BINARY_FILE_TYPE); // 设置当前工作目录 client.changeWorkingDirectory(getWorkDirectory()); } /** * 关闭连接 * * @throws IOException */ public void close() throws IOException { if (client.isConnected()) { client.logout(); client.disconnect(); // 也可设置为null workDirectory = config.getRootPath(); } ready = false; } /** * 获取等前工作目录的文件列表 * * @return * @throws IOException */ public String[] listFiles() throws IOException { if (!setReady()) { return null; } FTPFile[] files = client.listFiles(); int filesLength = files.length; String[] fileNameArr = new String[filesLength]; for (int i = 0; i < filesLength; i++) { fileNameArr[i] = files[i].getName(); } setClose(); return fileNameArr; } /** * 上传文件,文件名方式 * * @param path * @param name * @return * @throws Exception * @throws IOException */ public boolean uploadFile(String uploadFile, String remoteName) throws Exception { FileInputStream fis = null; try { if (!setReady()) { return false; } fis = new FileInputStream(uploadFile); if (remoteName.contains("/")) { String remotePath = remoteName.substring(0,remoteName.lastIndexOf("/")); client.makeDirectory(remotePath); remoteName=remoteName.substring(remoteName.lastIndexOf("/") + 1,remoteName.length()); client.changeWorkingDirectory(workDirectory+"/"+remotePath); } if (client.storeFile(remoteName, fis)) { logger.info(" upload success !!! "); return true; } client.changeWorkingDirectory(workDirectory); } catch (Exception e) { logger.error(" upload fail !!! "); throw e; } finally { if (fis != null) { try { fis.close(); } catch (Exception e2) { logger.error(e2.getMessage(), e2); } } setClose(); } return false; } /** * 上传文件,流方式 * * @param path * @param name * @return * @throws IOException */ public boolean uploadFile(InputStream stream, String name, String remoteName) { try { if (!setReady()) { return false; } if (client.storeFile(getWorkDirectory() + remoteName, stream)) { logger.info(" upload success !!! "); return true; } } catch (Exception e) { logger.error(" upload fail !!! "); return false; } finally { if (stream != null) { try { stream.close(); } catch (Exception e2) { logger.error(e2.getMessage(), e2); } } } return false; } /** * 下载文件 * * @param ftpFileName * @param localName * @return * @throws Exception */ public boolean downloadFile(String ftpFileName, String localName) throws Exception { FileOutputStream fos = null; try { File localFile=new File(localName); if(localFile!=null&&!localFile.exists()){ if(localFile.getParentFile()!=null&&!localFile.getParentFile().exists()){ localFile.getParentFile().mkdirs(); } localFile.createNewFile(); } fos = new FileOutputStream(localFile); if (!setReady()) { return false; } if (client.retrieveFile( new String(ftpFileName.getBytes(config.getLocalEncoding()), config.getRemoteEncoding()), fos)) { logger.info("download success !!! "); return true; } logger.info(" download fail !!! "); return false; } catch (Exception e) { logger.error("ftp下载文件失败ftpFileName:" + ftpFileName + ",localName" + localName, e); throw e; } finally { if (fos != null) { try { fos.close(); } catch (Exception e2) { } } } } /** * 删除文件 * * @param path * @param name * @return * @throws IOException */ public boolean removeFile(String name) throws Exception { if (!setReady()) { return false; } client.changeWorkingDirectory(config.getRootPath()); if (client.deleteFile(name)) { logger.info("remove file success !!! "); return true; } logger.info(" remove file fail !!! "); return false; } /** * 改变工作目录 * * @param path * @throws IOException */ public void setWorkDirectory(String path) throws IOException { workDirectory = (config.getRootPath() + path); // 如果是手动控制可以设置改变工作目录 if (handSwitch) { client.changeWorkingDirectory(workDirectory); } } /** * * 复制文件 * @param @param src * @param @param dst * @param @return * @param @throws Exception * @return boolean */ public boolean copyFile(String src,String dst) throws Exception { try { setReady(); if (dst.contains("/")) { String remotePath = dst.substring(0,dst.lastIndexOf("/")); client.makeDirectory(remotePath); } InputStream inputStream=client.retrieveFileStream(src); if (!client.completePendingCommand()) { return false; } // 如果读取的文件流不为空则复制文件 if (inputStream != null) { boolean tt= client.storeFile(dst, inputStream); // 关闭文件流 inputStream.close(); return tt; } return false; } catch (Exception e) { logger.error("ftp复制文件出错,[src:" + src+",dst:"+dst+"]", e); throw e; } } /** * 创建目录 * * @param pathname * @return * @throws IOException */ public boolean createDirectory(String pathname) throws IOException { if (!setReady()) { return false; } boolean okFlag = client.makeDirectory(pathname); setClose(); return okFlag; } /** * 获取当前工作目录 * * @return */ public String getWorkDirectory() { return workDirectory; } /** * 准备FTP连接环境 * * @return * @throws SocketException * @throws IOException */ private boolean setReady() throws SocketException, IOException { if (!ready) { if (!ready()) { logger.error("Ftp ready fail."); if (client.isConnected()) client.disconnect(); return false; } } ready = true; return true; } /** * 设置是否ftp连接 * * @throws IOException */ private void setClose() { try { if (!handSwitch) close(); } catch (Exception e) { logger.error("关闭ftp连接出错", e); } } /** * 打开手动连接 */ public void openHandSwitch() { handSwitch = true; } /** * 关闭手动连接 */ public void closeHandSwitch() { handSwitch = false; } }
相关推荐
ftp工具类,构造方法初始化类,连接ftp,列出所有文件内容,下载文件
FTP 工具类,赚钱积分下载东西,谢谢各位!谢谢各位!
ftp工具类,帮助你很容易的实现ftp功能
java操作FTP工具类:实现基本断点上传下载、实现上传下载进度汇报、实现中文目录创建及中文文件创建,添加对于中文的支持
FTP工具类,包括:文件夹上传下载,文件删除(包括非空文件夹),重命名等操作 基本的操作应该都有
在本文中,我们将深入探讨如何利用这个库开发一个FTP工具类,以便在Java应用程序中进行文件上传、下载和其他FTP操作。 首先,我们需要了解FTP的基本概念。FTP是一种用于在网络上进行文件传输的标准协议。它允许用户...
ftp操作工具类,用户ftp文件的添加,删除,等操作!
Java ftp工具类,可以实现ftp上传,读取,目录切换,内容创建,目录创建、检查文件是否存在,支持主动方式和被动方式读取
jdk1.7以上专用FTP工具类,本人花了半天时间调试通过,拿来即用,具体用法详见main函数。
对于初学者来说,理解并使用这样的FTP工具类可以帮助他们快速掌握FTP操作,避免了重复编写相同功能的代码。同时,这个工具类也展示了如何在Java中利用第三方库(如Apache Commons Net)来扩展Java标准库的功能。 ...
接下来,我们将深入探讨FTP工具类的主要功能、使用方法以及源码分析。 **1. FTPClient类** FTPClient是Apache Commons Net的核心类,它实现了FTP协议的大部分功能。通过这个类,我们可以连接到FTP服务器,执行登录...
本篇文章将详细讲解如何使用Java编写一个FTP工具类,实现连接FTP服务器、上传文件、删除文件、下载文件以及检索文件的功能。 首先,我们需要引入Apache Commons Net库,该库提供了丰富的FTP客户端API。在`pom.xml`...
Apache FTPClient操作FTP工具类
本话题将详细介绍如何使用Java实现FTP工具类以及所需的jar包。 Apache Commons Net是一个强大的Java网络实用程序库,它提供了多种网络协议的实现,包括FTP。在这个场景中,`commons-net-3.3.jar`是这个库的一个版本...
org.apache.commons.net.ftp.FTPClient FTP工具类,实现上传、下载、压缩到输出流下载等功能
Java FTP工具类是Java开发中用于处理FTP(File Transfer Protocol)协议的一种实用程序,它使得在Java应用程序中上传、下载、删除或者管理远程服务器上的文件变得简单。在本压缩包中,我们有一个名为"util"的文件,...
ftp 上传时,用到的工具类,项目上配置好ftp服务器后,controller可以方便的调用此工具类进行上传
ftp工具类,包含文件上传,文件删除,文件列表,查询当天文件类表方法
java的ftp工具类,需要的自行下载查看,有切换目录,创建目录方法。
本文将详细介绍标题和描述中提到的几个关键知识点:Java中的zip、rar(包括处理带密码的RAR文件)、gz压缩,以及FTP工具类的使用。 1. **Java ZIP压缩与解压缩**: Java内置的`java.util.zip`包提供了处理ZIP文件...