`

edtFtp实现FTP工具类

    博客分类:
  • Java
 
阅读更多

edtFtp是一个开源的纯Java的FTP客户端类库。由于它实现了FTP协议,程序员可以通过它对远程FTP服务器进行访问,而不用再手工编写各种命令和处理服务器的回应。下面是我在实现开发中实现的一个FTP操作类,将其记录在此,方便以后使用。源代码如下:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.enterprisedt.net.ftp.FTPException;
import com.enterprisedt.net.ftp.FTPFile;
import com.enterprisedt.net.ftp.FileTransferClient;
import com.enterprisedt.net.ftp.FileTransferOutputStream;


/**
 * FTP服务器操作工具类
 * 
 * @author XXX
 * 
 */
public class FtpService
{

    private static final Log logger = LogFactory.getLog(FtpService.class
        .getName());
    // 部分静态常量
    private static final String SYSTEM_CONFIG_ITEM_FTPIP = "ip";
    private static final String SYSTEM_CONFIG_ITEM_FTPPORT = "port";
    private static final String SYSTEM_CONFIG_ITEM_FTPLOGINNAME = "username";
    private static final String SYSTEM_CONFIG_ITEM_FTPLOGINPWD = "password";
    private static final String SYSTEM_CONFIG_ITEM_PARAM_TYPE = "marketingActiveFtpParam";

    // FTP服务器IP地址
    private String ftpServiceIP;
    // FTP服务器端口
    private int ftpServicePort;
    // 登录账号
    private String loginUser;
    // 登录密码
    private String loginPwd;
    // FTP客户端对象
    private FileTransferClient ftpClient = null;
    // 单例对象
    private static FtpService ftpService = null;

    /**
     * 获取单例对象方法
     * 
     * @return
     * @throws Exception
     */
    public static synchronized FtpService getInstance() throws Exception
    {
        try
        {
            if (ftpService == null)
            {
                logger.info("从数据库获取FTP服务器相关配置,创建FTP客户端");
                String ftpServiceIP = SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPIP);
                int ftpServicePort = Integer.parseInt(SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPPORT));
                String loginUser = SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPLOGINNAME);
                String loginPwd = SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPLOGINPWD);
                ftpService = new FtpService(ftpServiceIP, ftpServicePort, loginUser, loginPwd);
            }
        }
        catch (Exception e)
        {
            throw new Exception("获取FTP服务器实例时异常,FTP服务器配置错误,请检查" + e);
        }
        return ftpService;
    }

    /**
     * 为了系统参数修改后,能创建新的Ftp客户端对象,特增加了此方法
     * 
     * @return
     * @throws Exception
     */
    public static synchronized FtpService getInstance(boolean isNew) throws Exception
    {
        try
        {
            
            if(isNew)
            {
                logger.info("从数据库获取FTP服务器相关配置,创建FTP客户端");
                String ftpServiceIP = SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPIP);
                int ftpServicePort = Integer.parseInt(SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPPORT));
                String loginUser = SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPLOGINNAME);
                String loginPwd = SystemData.getParameterAPI().getParameterValue(SYSTEM_CONFIG_ITEM_PARAM_TYPE,SYSTEM_CONFIG_ITEM_FTPLOGINPWD);
                ftpService = new FtpService(ftpServiceIP, ftpServicePort, loginUser, loginPwd);
            }
            else
                getInstance();
        }
        catch (Exception e)
        {
            throw new Exception("获取FTP服务器实例时异常,FTP服务器配置错误,请检查" + e);
        }
        return ftpService;
    }
    
    /**
     * 获取指定路径下指定目录或文件名称列表
     * 
     * @param dir:指定路径
     * @param directoryName:指定的目录名称,全称或部分
     * @return:名称列表
     */
    public synchronized List<String> getDirectoryListByDir(String dir,
        String directoryName) throws Exception
    {
        logger
            .info(String.format("从FTP服务上获取指定路径下的目录或文件名称列表,路径[%s],目录或文件名称[%s]。",
                dir, directoryName));
        List<String> allDirectorys = null;
        try
        {
            ftpClient.changeDirectory(dir);
            FTPFile[] files = ftpClient.directoryList(directoryName.trim());
            int length = files.length;
            if (length > 0)
            {
                allDirectorys = new ArrayList<String>();
                for (int i = 0; i < length; i++)
                {
                    allDirectorys.add(files[i].getName().trim());
                }
            }
            changeToRootDirectoryByDir(dir);
        }
        catch (Exception e)
        {
            throw new Exception("获取指定路径下指定目录名称列表时发生异常,原因:" + e);
        }

        return allDirectorys;
    }

    /**
     * 将FTP服务器指定目录下的指定文件下载到本地指定的文件中并将FTP上的文件删除掉
     * 
     * @param dir:FTP服务器上目录
     * @param localFileName:存放到本地的文件名称(包含存放的路径,如无路径则默认为当前路径)
     * @param remoteFileName:FTP服务器上的文件名称
     */
    public synchronized void downloadRemoteFileToLocalAndDeleteIt(String dir,
        String localTempProcessFileName, String localBackupFileName,
        String remoteFileName) throws Exception
    {
        logger
            .info(String
                .format(
                    "将FTP服务器指定目录下的指定文件下载到本地指定的文件中并将FTP上的文件删除掉,FTP服务器目录[%s],远程文件名[%s],本地文件名[%s]。",
                    dir, remoteFileName, localTempProcessFileName));
        try
        {
            ftpClient.changeDirectory(dir);
            boolean isExists = ftpClient.exists(remoteFileName);
            if (!isExists)
            {
                logger.info(remoteFileName + "文件在FTP服务器目录" + dir
                    + "不存在,请检查FTP服务器");
                return;
            }
            ftpClient.downloadFile(localTempProcessFileName, remoteFileName);
            logger.info("已将FTP服务器上的文件" + remoteFileName + "下载到本地文件"
                + localTempProcessFileName);
            ftpClient.downloadFile(localBackupFileName, remoteFileName);

            ftpClient.deleteFile(remoteFileName);
            logger.info("已将FTP服务器上的文件" + remoteFileName + "删除");
            changeToRootDirectoryByDir(dir);
        }
        catch (Exception e)
        {
            throw new Exception("将FTP服务器指定目录下的指定文件下载到本地指定的文件时发生异常,原因:" + e);
        }
    }

    /**
     * 将FTP服务器上的文件下载到本地
     * 
     * @param remoteFileName
     * @param localFileName
     * @throws Exception
     */
    public synchronized boolean downloadRemotFileToLocal(String remoteFileName,
        String localFileName) throws Exception
    {
        logger.info(String.format("将FTP服务器上的文件下载到本地,远程文件名[%s],本地文件名[%s]。",
            remoteFileName, localFileName));
        String msg = "";
        try
        {
            // connectToServer();
            boolean isExists = ftpClient.exists(remoteFileName);
            if (!isExists)
            {
                msg = remoteFileName + "文件在FTP服务器上不存在,请检查FTP服务器";
                logger.info(msg);
               throw new RuntimeException(msg);
            }
            ftpClient.downloadFile(localFileName, remoteFileName);
            logger.info("已将FTP服务器上的文件" + remoteFileName + "下载到本地文件"
                + localFileName);
        }
        catch (RuntimeException e)
        {
            msg = "将FTP服务器上文件下载到本地时发生异常,原因:" + e.getMessage();
            logger.info(msg);
           throw new RuntimeException(msg);
        }
        return true;
    }

    /**
     * 将指定的本地文件上传到FTP服务器上
     * 
     * @param localFileName
     * @param remoteFileName
     */
    public synchronized void uploadFileToFtpServer(String localFileName,
        String remoteFileName) throws Exception
    {
        logger.info(String.format("将指定的本地文件上传到FTP服务器上,本地文件名[%s],远程文件名[%s]。",
            localFileName, remoteFileName));
        try
        {
            ftpClient.uploadFile(localFileName, remoteFileName);
            logger.info("成功将文件" + localFileName + "上传到FTP服务器");
        }
        catch (Exception e)
        {
            throw new Exception("将指定的本地文件上传到FTP服务器上时发生异常,原因:" + e);
        }
    }

    /**
     * 将内容串上传到FTP服务器
     * 
     * @param remoteFileName
     * @param allContents
     * @throws Exception
     */
    public synchronized void uploadContentsToFtpServer(String remoteFileName,
        String allContents) throws Exception
    {
        logger.info(String.format("将内容串上传到FTP服务器上指定的文件中,远程文件名[%s],内容串[%s]。",
            remoteFileName, allContents));
        FileTransferOutputStream outputStream = null;
        try
        {
            outputStream = ftpClient.uploadStream(remoteFileName);
            outputStream.write(allContents.getBytes());
            outputStream.flush();

            logger.info("成功将文件" + remoteFileName + "上传到FTP服务器");
        }
        catch (Exception e)
        {
            throw new Exception("将内容上传到FTP服务器上时发生异常,原因:" + e);
        }
        finally
        {
            if (outputStream != null)
            {
                outputStream.close();
                outputStream = null;
            }
        }
    }

    /**
     * 根据传入的目录路径返回到FTP服务器根目录,供下次使用
     * 
     * @param dir
     * @throws FTPException
     * @throws IOException
     */
    private synchronized void changeToRootDirectoryByDir(String dir)
        throws FTPException, IOException
    {
        logger
            .info(String.format("根据传入的目录路径返回到FTP服务器根目录,供下次使用,当前路径[%s]。", dir));
        int parentLevels = dir.split("/").length;
        for (int i = 0; i < parentLevels; i++)
            ftpClient.changeToParentDirectory();
    }

    /**
     * 连接FTP服务器,并登录服务器
     * 
     * @throws FTPException
     * @throws IOException
     */
    public synchronized void connectToServer() throws Exception
    {
        ftpClient = new FileTransferClient();
        try
        {
            ftpClient.setRemoteHost(ftpServiceIP);
            ftpClient.setRemotePort(ftpServicePort);
            ftpClient.setUserName(loginUser);
            ftpClient.setPassword(loginPwd);
            ftpClient.connect();
            logger.info(String.format("连接并登录到FTP服务器,IP[%s],Port[%d],User[%s]。",
                ftpServiceIP, ftpServicePort, loginUser));
        }
        catch (Exception e)
        {
            ftpService = null;
            throw new Exception("连接和登录FTP服务器时发生异常,请检查FTP服务器参数配置,原因:" + e);
        }
    }

    /**
     * 断开与FTP服务器的连接
     * 
     * @throws FTPException
     * @throws IOException
     */
    public synchronized void disconnectToServer() throws Exception
    {
        try
        {
            if (ftpClient != null)
            {
                if (ftpClient.isConnected())
                {
                    ftpClient.disconnect();
                    ftpClient = null;
                    logger.info("断开与FTP服务器连接");
                }
            }
        }
        catch (Exception e)
        {
            throw new Exception("断开与FTP服务器连接时发生异常,原因:" + e);
        }
    }

    /**
     * 无参私有构造器
     */
    private FtpService()
    {
        super();
    }

    /**
     * 全参私有构造器
     * 
     * @param ftpServiceIP
     * @param ftpServicePort
     * @param loginUser
     * @param loginPwd
     */
    private FtpService(String ftpServiceIP, int ftpServicePort,
        String loginUser, String loginPwd)
    {
        super();
        this.ftpServiceIP = ftpServiceIP;
        this.ftpServicePort = ftpServicePort;
        this.loginUser = loginUser;
        this.loginPwd = loginPwd;
    }
}
 
分享到:
评论

相关推荐

    FtpUtil.java(ftp工具类)

    ftp工具类,构造方法初始化类,连接ftp,列出所有文件内容,下载文件

    c#实现ftp工具类

    这是使用c#实现FTP功能的工具类,包含socket技术。

    FTP 工具类

    FTP 工具类,赚钱积分下载东西,谢谢各位!谢谢各位!

    Java ftp工具类,可以实现ftp上传,读取,目录切换,内容创建,目录创建、检查文件是否存在,支持主动方式和被动方式读取

    Java ftp工具类,可以实现ftp上传,读取,目录切换,内容创建,目录创建、检查文件是否存在,支持主动方式和被动方式读取

    java版FTP工具类

    ftp工具类,帮助你很容易的实现ftp功能

    FTP工具类实现ftp上传下载

    采用java实现FTP文件的上传下载,包含文件以及文件夹上传下载,新建文件夹等基本相关操作,不会出现文件名的中文乱码,内含demo相关测试以及jar包,可直接导入使用,采用MyEclipse8.5,jdk1.6亲测无问题

    JAVA 操作FTP的工具类,上传,下载,删除功能都有了。

    在这个场景中,我们有一个工具类,它包含了FTP的上传、下载和删除功能,这对于任何需要与FTP服务器交互的应用程序都是非常有用的。 首先,让我们详细了解一下FTP上传功能。在Java中,我们可以使用`FTPClient`类来...

    java操作FTP工具类

    java操作FTP工具类:实现基本断点上传下载、实现上传下载进度汇报、实现中文目录创建及中文文件创建,添加对于中文的支持

    基于springboot的FtpUtil工具类.zip

    这为开发者提供了一个可以直接学习和借鉴的实例,通过阅读源码,开发者可以更深入地理解SpringBoot与FTP的集成,以及FtpUtil工具类的具体实现。 总的来说,基于SpringBoot的FtpUtil工具类为我们提供了一种便捷的...

    ftp工具类操作ftp服务器

    ftp操作工具类,用户ftp文件的添加,删除,等操作!

    java ,android平台FTP工具类

    FTP工具类,包括:文件夹上传下载,文件删除(包括非空文件夹),重命名等操作 基本的操作应该都有

    文件FTP上传的工具类

    ftp 上传时,用到的工具类,项目上配置好ftp服务器后,controller可以方便的调用此工具类进行上传

    Android ftp 下载工具类

    本知识点主要集中在如何使用Java实现一个FTP下载工具类,以便在Android应用程序中集成这一功能。以下是对`DownloadFTPUtil.java`文件中可能包含的代码和相关知识点的详细解释。 1. **FTP客户端库**:在Android中,...

    ftp上传下载工具类

    FTP上传下载工具类通常是指一个编程接口或代码库,为开发者提供便捷的FTP客户端功能,包括连接到FTP服务器、上传文件、下载文件以及管理远程目录等操作。 在开发中,我们可能遇到以下关键知识点: 1. FTP基本概念...

    ftp上传工具类

    java的ftp工具类,需要的自行下载查看,有切换目录,创建目录方法。

    org.apache.commons.net.ftp.FTPClient FTP工具类,实现上传、下载、压缩到输出流下载等功能

    org.apache.commons.net.ftp.FTPClient FTP工具类,实现上传、下载、压缩到输出流下载等功能

    使用Apache commons-net.jar开发FTP工具类

    总结起来,通过使用Apache Commons Net.jar,我们可以轻松地创建一个FTP工具类,实现FTP连接、文件上传和下载等操作。这个库不仅简化了网络编程的复杂性,还提供了稳定和高效的FTP客户端实现。在实际项目中,这样的...

    apache FTP 工具类

    接下来,我们将深入探讨FTP工具类的主要功能、使用方法以及源码分析。 **1. FTPClient类** FTPClient是Apache Commons Net的核心类,它实现了FTP协议的大部分功能。通过这个类,我们可以连接到FTP服务器,执行登录...

    IOS FTP客户端工具类

    在iOS开发中,FTP(File Transfer Protocol)客户端工具类是一个重要的组成部分,主要用于与FTP服务器进行交互,实现文件的上传、下载、删除以及创建新目录等操作。本篇将详细讲解如何构建一个iOS FTP客户端工具类,...

    Apache FTPClient操作FTP工具类

    Apache FTPClient操作FTP工具类

Global site tag (gtag.js) - Google Analytics