`

使用Apache的commons-net包实现FTP操作的类

    博客分类:
  • Java
阅读更多
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.StringTokenizer;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

import com.ea.rs4.Logger;
import com.ea.rs4.utils.StringUtils;

/**
 * This class is used to upload files to ftp server or get files from ftp server
 * 
 * @author Leo.Zhou
 */
public class FtpTool {

    private static final Logger LOG = new Logger(FtpTool.class.getSimpleName());

    private String ip;

    private int port;

    private String user;

    private String pwd;

    private String remotePath;

    FTPClient ftpClient;

    /**
     * Connect to server
     * 
     * @param ip
     * @param port
     * @param user
     * @param pwd
     * @return
     * @throws FtpException
     */
    public boolean connectServer(String ip, int port, String user, String pwd) throws FtpException {
        boolean isSuccess = false;
        try {
            ftpClient = new FTPClient();
            ftpClient.connect(ip, port);
            ftpClient.login(user, pwd);
            isSuccess = true;
        } catch (Exception ex) {
            LOG.error("Can not connect to remote ftp server");
            throw new FtpException(ex);
        }
        return isSuccess;
    }

    /**
     * Create directory
     * 
     * @param dir
     * @return
     * @throws FtpException
     */
    private void createDir(String dir) throws FtpException {
        try {
            ftpClient.setFileType(FTP.ASCII_FILE_TYPE);

            StringTokenizer s = new StringTokenizer(dir, "/");
            s.countTokens();
            String pathName = "";
            while (s.hasMoreElements()) {
                String currentFolder = (String) s.nextElement();
                if (currentFolder == null || currentFolder.length() == 0) {
                    continue;
                }
                pathName = pathName + (pathName.equals("")?"":"/") + currentFolder;
                if(!isDirExist(pathName)) {
                    boolean result = ftpClient.makeDirectory(pathName);
                    if(!result) {
                        throw new FtpException(String.format("Permission denied, can not create folder : %s", pathName));
                    }
                }
            }

            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        } catch (IOException e1) {
            throw new FtpException(e1);
        }
    }

    /**
     * Check is directory exist
     * 
     * @param dir
     * @return
     * @throws FtpException
     */
    private boolean isDirExist(String dir) {
        if(StringUtils.isEmpty(dir)) {
            return true;
        }
        String preFolder = null;
        String lastFolder = null;

        if(dir.contains("/")) {
            preFolder = dir.substring(0, dir.lastIndexOf("/"));
            lastFolder = dir.substring(dir.lastIndexOf("/") + 1, dir.length());
        } else {
            preFolder = "";
            lastFolder = dir;
        }

        boolean flag = false;
        try {
            FTPFile[] ftpFileArr = null;
            if(preFolder.equals("")) {
                ftpFileArr = ftpClient.listFiles();
            } else {
                ftpFileArr = ftpClient.listFiles(preFolder);
            }
            LOG.debug("Files in top folder : %s", Arrays.toString(ftpFileArr));
            for (FTPFile ftpFile : ftpFileArr) {
                if (ftpFile.isDirectory() && ftpFile.getName().equalsIgnoreCase(lastFolder)) {
                    flag = true;
                    break;
                }
            }
        } catch (IOException e) {
            flag = false;
        }
        return flag;
    }

    /**
     * Upload file to ftp server
     * 
     * @param remotePath
     * @param localPath
     * @param filename
     * @throws FtpException
     */
    public void uploadFile(String remotePath, File localFile) throws FtpException {
        try {
            if (connectServer(getIp(), getPort(), getUser(), getPwd())) {
                if (!isDirExist(remotePath)) {
                    createDir(remotePath);
                }

                if (remotePath.length() != 0)
                    ftpClient.changeWorkingDirectory(remotePath);

                ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

                InputStream iStream = null;
                try {
                    iStream = new FileInputStream(localFile);
                    boolean result = ftpClient.storeFile(localFile.getName(), iStream);
                    if(!result) {
                        LOG.error("Upload file to FTP server failed.");
                        throw new FtpException("Upload file failed.");
                    }
                } finally {
                    if (iStream != null) {
                        iStream.close();
                    }
                }

                closeServer();
            }
        } catch (IOException ex) {
            throw new FtpException("Ftp upload file error:", ex);
        }
    }

    /**
     * Delete FTP file by link
     * 
     * @param link
     * @throws FtpException
     */
    public void deleteFileByLink(String link) throws FtpException{
        try {
            if (connectServer(getIp(), getPort(), getUser(), getPwd())) {
                ftpClient.deleteFile(getRemotePath() + "/" + link);
                int status = ftpClient.getReplyCode();
                LOG.debug("Ftp delete info:"+ftpClient.getReplyString());
                if(status == 250) {
                    LOG.debug("Delete file from FTP server success.");
                } else {
                    LOG.info("Delete file from FTP server failed.FTP status : %s, link : %s", status, link);
                    throw new FtpException(String.format("Delete file from FTP server failed, link : %s, FTP status : %s", link, status));
                }
                closeServer();
            }
        } catch (IOException ex) {
            throw new FtpException(String.format("Delete file from FTP server failed, link : %s", link));
        }
    }

    /**
     * Close ftp server connection
     * 
     * @throws FtpException
     */
    private void closeServer() throws FtpException {
        if (ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
            } catch (IOException e) {
                throw new FtpException(e);
            }
        }
    }

    /**
     * @return
     */
    public String getIp() {
        return ip;
    }

    /**
     * @return
     */
    public int getPort() {
        return port;
    }

    /**
     * @return
     */
    public String getPwd() {
        return pwd;
    }

    /**
     * @return
     */
    public String getUser() {
        return user;
    }

    /**
     * @param string
     */
    public void setIp(String string) {
        ip = string;
    }

    /**
     * @param i
     */
    public void setPort(int i) {
        port = i;
    }

    /**
     * @param string
     */
    public void setPwd(String string) {
        pwd = string;
    }

    /**
     * @param string
     */
    public void setUser(String string) {
        user = string;
    }

    /**
     * @return
     */
    public String getRemotePath() {
        return remotePath;
    }

    /**
     * @param string
     */
    public void setRemotePath(String remotePath) {
        this.remotePath = remotePath;
        this.remotePath = this.remotePath.replace("\\", "/");
        LOG.debug("Saving path in current system: %s", this.remotePath);
    }
}

分享到:
评论

相关推荐

    apache commons-net-3.5.jar

    使用apache commons-net包实现文件ftp上传

    commons-net-jar包.zip

    在这个"commons-net-jar包.zip"压缩包中,包含了两个版本的Apache Commons Net库:commons-net-3.3.jar和commons-net-3.4.jar。这两个版本虽然相差不大,但每个新版本通常会带来一些改进和修复,使得开发者能够更...

    commons-net-ftp-2.0.jar.zip

    在`commons-net-ftp-2.0.jar`中,你可以找到一系列预定义的类和接口,如`FTPClient`、`FTPFile`、`FTPSSLConnection`等,它们为FTP操作提供了丰富的功能。`FTPClient`是核心类,负责建立和管理与FTP服务器的连接,...

    利用commons-net包实现ftp上传下载例子

    标题中的“利用commons-net包实现ftp上传下载例子”是指通过Apache Commons Net库来实现FTP(File Transfer Protocol)的上传和下载功能。Apache Commons Net是Apache软件基金会开发的一个Java库,它提供了多种网络...

    apache的FTP包commons-net-1.4.1.jar,jakarta-oro-2.0.8.jar

    Apache的FTP库是Java开发中一个非常实用的工具,它主要包含了两个核心的JAR包:`commons-net-1.4.1.jar`和`jakarta-oro-2.0.8.jar`。这两个包提供了丰富的功能,允许开发者在Java应用中实现FTP(文件传输协议)的...

    commons-net-3.6.jar

    Apache Commons Net中的FTPClient类是FTP操作的核心,它实现了完整的FTP协议栈。FTPClient提供了各种方法,如connect()用于建立与FTP服务器的连接,login()进行用户身份验证,uploadFile()和downloadFile()用于文件...

    Android 利用commons-net-3.3实现ftp上传下载Demo

    implementation 'org.apache.commons:commons-net:3.6' // 使用最新版本替代3.3 } ``` 然后,我们需要创建一个FTP客户端实例并配置连接参数,如服务器地址、端口号、用户名和密码。以下是一个简单的FTP连接示例: ...

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

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

    apache commons-net-3.5

    1. **FTP协议支持**:Apache Commons Net提供了全面的FTP客户端实现,涵盖了FTP协议的各种功能,如连接、登录、目录浏览、文件传输(PUT和GET)、断点续传、被动模式等。这使得开发人员无需深入了解FTP协议的细节,...

    commons-net-3.6

    3. **commons-net-examples-3.6.jar**:包含了一些示例代码,演示了如何使用Apache Commons Net库的各种功能。这些例子是学习和快速上手的良好起点,可以帮助开发者快速理解和应用库中的函数。 此外,压缩包中还有...

    commons-net-3.6 jar包.zip

    本文将深入解析`commons-net-3.6.jar`包,了解其核心功能、使用方法以及在实际开发中的应用。 Apache Commons Net库自1999年以来就一直在为Java开发者提供服务,它的主要目标是提供一套全面且易于使用的API,用于...

    apache-jakarta旗下的所有开源项目jar文件

    apache-jakarta旗下的所有开源...apache-jakarta-commons-net-ftp.jar apache-jakarta-oro.jar apache-jakarta-oro-2.0.8.jar commons-io-2.1-bin commons-logging-1.1.1-bin commons-modeler-2.0.1 commons-net-1.4.1

    apache-commons源码及jar文件

    Apache Commons是一个非常有用的工具包,解决各种实际的通用问题。(附件中提供了该工具包的jar包,及源文件以供研究) BeanUtils Commons-BeanUtils 提供对 Java 反射和自省API的包装 Betwixt Betwixt提供将 ...

    commons-net实现ftp帮助文档 api

    Apache Commons Net提供了丰富的类和方法,使得开发者可以方便地执行FTP任务,如上传、下载文件,创建、删除目录,以及管理文件权限等。 **FTPClient类** 是这个库中的核心,它实现了FTP协议的大部分功能。首先,你...

    基于apache ftp jar包 commons-net-3.3.jar

    包含commons-net-3.4.jar,commons-net-3.4-sources.jar,commons-net-examples-3.4.jar包,ftp上传主要依靠commons-net-3.4.jar

    commons-net-1.4.1.jar

    Apache Commons Net 1.4.1提供了一个全面的Java实现,支持FTP的各种操作,包括上传、下载、列出目录、创建和删除文件等。这个库不仅简化了FTP交互,还处理了许多底层的网络细节,如连接管理和错误处理,使得开发者...

    commons-net-3.3-3.4-3.5-3.6.zip

    Apache Commons Net库是Apache软件基金会的一个项目,它提供了一系列Java类和方法来处理各种网络协议,包括FTP、FTPS、TFTP、Telnet、NNTP、SMTP等。在FTP方面,这个库提供了丰富的功能,如创建、删除、移动文件,...

    commons-net-3.3.jar

    在`commons-net-3.3.jar`中,FTPClient类是核心,它实现了完整的FTP协议。开发者可以通过创建FTPClient实例,然后连接到FTP服务器,进行登录、设置传输模式(ASCII或BINARY)、改变工作目录、上传和下载文件等一系列...

    commons-net-3.1.jar,3.3,3.6版本

    这个库在不同的版本中提供了各种功能的增强和优化,比如`commons-net-3.1.jar`, `commons-net-3.3.jar`, 和 `commons-net-3.6.jar`。下面将详细阐述这些版本中涉及的主要知识点: 1. **FTP(文件传输协议)支持**:...

    SpringBoot2.2+commons-pool2实现多Ftp连接池完整项目,开箱即用,经过长期生产使用稳定可靠

    使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...

Global site tag (gtag.js) - Google Analytics