Apache的commons-net实现FTP的文件上传下载

2018-03-21 20:04:47
1040次阅读
0个评论

Commons net包中的ftp工具类能够帮助我们轻松实现Ftp方式的文件上传/下载。其中最重要的一个类就是FTPClient类,这个提供了许多FTP操作相关的

方法,比如链接,登录,上传,下载,和注销。

FTP 操作的过程一般为连接服务器,登录,进行文件上传/下载,文件(目录)的添加删除修改等操作。平常用的比较多的是文件的上传和下载。


import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.net.SocketException;  
import java.util.ArrayList;  
import java.util.List;  
  
import org.apache.commons.io.FileUtils;  
import org.apache.commons.io.IOUtils;  
import org.apache.commons.net.ftp.FTPClient;  
import org.apache.commons.net.ftp.FTPFile;  
import org.apache.commons.net.ftp.FTPReply;  
import org.apache.log4j.Logger;  
  
public class FTPUtil {  
  
    private static final Logger logger = Logger.getLogger(FTPUtil.class);  
    private static String encoding = System.getProperty("file.encoding");  
      
    FTPClient client;  
  
    /** ftp服务器地址 */  
    private String host;  
    /** ftp 端口号 默认21 */  
    private int port = 21;  
    /** ftp服务器用户名 */  
    private String username;  
    /** ftp服务器密码 */  
    private String password;  
    /** ftp远程目录 */  
    private String remoteDir;  
    /** 本地存储目录 */  
    private String localDir;  
    /** 文件路径通配符 默认列出所有*/  
    private String regEx = "*";  
    /** 指定要下载的文件名 */  
    private String downloadFileName;  
  
    /** 
     * 设置连接属性 
     *  
     * @param host 
     * @param username 
     * @param password 
     * @return 
     */  
    public FTPUtil setConfig(String host, String username, String password) {  
        this.host = host;  
        this.username = username;  
        this.password = password;  
        return this;  
    }  
  
    /** 
     * 设置连接属性 
     *  
     * @param host 
     * @param port 
     * @param username 
     * @param password 
     */  
    public FTPUtil setConfig(String host, int port, String username,String password) {  
        this.host = host;  
        this.port = port;  
        this.username = username;  
        this.password = password;  
        return this;  
    }  
  
    /** 
     * 连接FTP服务器 
     */  
    private FTPUtil connectServer() {  
        client = new FTPClient();  
        //设置超时时间  
        client.setConnectTimeout(30000);  
        try {  
            // 1、连接服务器  
            if(!client.isConnected()){  
                // 如果采用默认端口,可以使用client.connect(host)的方式直接连接FTP服务器  
                client.connect(host, port);  
                // 登录  
                client.login(username, password);  
                // 获取ftp登录应答码  
                int reply = client.getReplyCode();  
                // 验证是否登陆成功  
                if (!FTPReply.isPositiveCompletion(reply)) {  
                    logger.info("未连接到FTP,用户名或密码错误。");  
                    client.disconnect();  
                    throw new RuntimeException("未连接到FTP,用户名或密码错误。");  
                } else {  
                    logger.info("FTP连接成功。IP:"+host +"PORT:" +port);  
                }  
                // 2、设置连接属性  
                client.setControlEncoding(encoding);  
                // 设置以二进制方式传输  
                client.setFileType(FTPClient.BINARY_FILE_TYPE);    
                client.enterLocalPassiveMode();  
            }  
        } catch (SocketException e) {  
            try {  
                client.disconnect();  
            } catch (IOException e1) {  
            }  
            logger.error("连接FTP服务器失败" + e.getMessage());  
            throw new RuntimeException("连接FTP服务器失败" + e.getMessage());  
        } catch (IOException e) {  
        }  
        return this;  
    }  
      
  
    /** 
     * 下载文件 
     */  
    public List<File> download(){  
          
        List<File> files = null;  
          
        this.connectServer();  
        InputStream is = null;  
        File downloadFile = null;  
        try {  
            // 1、设置远程FTP目录  
            client.changeWorkingDirectory(remoteDir);  
            logger.info("切换至工作目录【" + remoteDir + "】");  
            // 2、读取远程文件  
            FTPFile[] ftpFiles = client.listFiles(regEx);  
            if(ftpFiles.length==0) {  
                logger.warn("文件数为0,没有可下载的文件!");  
                return null;  
            }  
            logger.info("准备下载" + ftpFiles.length + "个文件");  
            // 3、保存文件到本地  
            for (FTPFile file : ftpFiles) {  
                //如果有指定下载的文件  
                if(StringUtils.isNotBlank(downloadFileName) && !file.getName().equals(downloadFileName)){  
                    continue;  
                }  
                if(files == null) files = new ArrayList<File>();  
                is = client.retrieveFileStream(file.getName());  
                if(is==null) throw new RuntimeException("下载失败,检查文件是否存在");  
                downloadFile = new File(localDir + file.getName());  
                FileOutputStream fos = FileUtils.openOutputStream(downloadFile);  
                IOUtils.copy(is, fos);  
                client.completePendingCommand();  
                IOUtils.closeQuietly(is);  
                IOUtils.closeQuietly(fos);  
                  
                /* 
                //另外一种方式,供参考 
                OutputStream is = new FileOutputStream(localFile); 
                ftpClient.retrieveFile(ff.getName(), is); 
                is.close(); 
                */  
                  
                files.add(downloadFile);  
            }  
            logger.info("文件下载成功,下载文件路径:" + localDir);  
            return files;  
        } catch (IOException e) {  
            logger.error("下载文件失败" + e.getMessage());  
            throw new RuntimeException("下载文件失败" + e.getMessage());  
        }  
    }  
      
    /** 
     * 下载文件 
     * @param localDir 
     * @param remoteDir 
     */  
    public List<File> download(String remoteDir,String localDir){  
        this.remoteDir = remoteDir;  
        this.localDir = localDir;  
        return this.download();  
    }  
    /** 
     * 下载文件 
     * @param remoteDir 
     * @param regEx 文件通配符 
     * @param localDir 
     * @return 
     */  
    public List<File> download(String remoteDir,String regEx,String localDir){  
        this.remoteDir = remoteDir;  
        this.localDir = localDir;  
        this.regEx = regEx;  
        return this.download();  
    }  
      
    /** 
     * 下载文件 
     * @param downloadFileName 指定要下载的文件名称 
     * @return 
     */  
    public List<File> download(String downloadFileName){  
        this.downloadFileName = downloadFileName;  
        return this.download();  
    }  
      
    /** 
     * 上传文件 
     * @param files 
     */  
    public void upload(List<File> files){  
          
        OutputStream os = null;  
        try {  
            // 2、取本地文件  
            if(files == null || files.size()==0) {  
                logger.warn("文件数为0,没有找到可上传的文件");  
                return;  
            }  
            logger.info("准备上传" + files.size() + "个文件");  
            // 3、上传到FTP服务器  
            for(File file : files){  
                this.connectServer();  
                // 1、设置远程FTP目录  
                client.changeWorkingDirectory(remoteDir);  
                logger.info("切换至工作目录【" + remoteDir + "】");  
                os = client.storeFileStream(file.getName());  
                if(os== null) throw new RuntimeException("上传失败,请检查是否有上传权限");  
                IOUtils.copy(new FileInputStream(file), os);  
                IOUtils.closeQuietly(os);  
            }  
            logger.info("文件上传成功,上传文件路径:" + remoteDir);  
        } catch (IOException e) {  
            logger.error("上传文件失败" + e.getMessage());  
            throw new RuntimeException("上传文件失败" + e.getMessage());  
        }  
    }  
      
    public OutputStream getOutputStream(String fileName){  
        OutputStream os = null;  
        this.connectServer();  
        // 1、设置远程FTP目录  
        try {  
            client.changeWorkingDirectory(remoteDir);  
            logger.info("切换至工作目录【" + remoteDir + "】");  
            os = client.storeFileStream(fileName);  
            if(os== null) throw new RuntimeException("服务器上创建文件对象失败");  
            return os;  
        } catch (IOException e) {  
            logger.error("服务器上创建文件对象失败" + e.getMessage());  
            throw new RuntimeException("服务器上创建文件对象失败" + e.getMessage());  
        }  
    }  
    /** 
     * 上传文件 
     * @param files 上传的文件 
     * @param remoteDir 
     */  
    public void upload(List<File> files,String remoteDir){  
        this.remoteDir = remoteDir;  
        this.upload(files);  
    }  
      
    /** 
     * 上传文件 
     * @param file 
     */  
    public void upload(File file){  
        List<File> files = new ArrayList<File>();  
        files.add(file);  
        upload(files);  
    }  
      
    /** 
     * 判断文件在FTP上是否存在 
     * @param fileName 
     * @return 
     */  
    public boolean isFileExist(String fileName) {  
          
        boolean result = false;  
        this.connectServer();  
        try {  
            // 1、设置远程FTP目录  
            client.changeWorkingDirectory(remoteDir);  
            logger.info("切换至工作目录【" + remoteDir + "】");  
            // 2、读取远程文件  
            FTPFile[] ftpFiles = client.listFiles(regEx);  
            if(ftpFiles.length==0) {  
                logger.warn("文件数为0,没有可下载的文件!");  
                return result;  
            }  
            // 3、检查文件是否存在  
            for (FTPFile file : ftpFiles) {  
                if(file.getName().equals(fileName)){  
                    result = true;  
                    break;  
                }  
            }  
        } catch (Exception e) {  
            logger.error("检查文件是否存在失败" + e.getMessage());  
            throw new RuntimeException("检查文件是否存在失败" + e.getMessage());  
        }  
          
        return result;  
    }  
  
     /** 
     * 关闭连接 
     */  
    public void closeConnect() {  
        try {  
            client.disconnect();  
            logger.info(" 关闭FTP连接!!! ");  
        } catch (IOException e) {  
            logger.warn(" 关闭FTP连接失败!!! ",e);  
        }  
    }  
    public String getRemoteDir() {  
        return remoteDir;  
    }  
  
    public void setRemoteDir(String remoteDir) {  
        this.remoteDir = remoteDir;  
    }  
  
    public String getLocalPath() {  
        return localDir;  
    }  
  
    public void setLocalPath(String localPath) {  
        this.localDir = localPath;  
    }  
  
    public String getDownloadFileName() {  
        return downloadFileName;  
    }  
  
    public void setDownloadFileName(String downloadFileName) {  
        this.downloadFileName = downloadFileName;  
    }  
      
    @Override  
    public String toString() {  
        return "FTPUtil [host=" + host + ", port=" + port + ", username="  
                + username + ", password=" + password + "]";  
    }  
}
收藏00

登录 后评论。没有帐号? 注册 一个。