zoukankan      html  css  js  c++  java
  • FTPClient 工具类

    package com.photoann.core.util;
    
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Arrays;
    
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPReply;
    import org.apache.log4j.Logger;
    
    /**
     * 提供上传图片文件, 文件夹 
     * @author MYMOON
     * 
     */
    public class UpFTPClient {
        private static Logger logger = Logger.getLogger(UpFTPClient.class.getName());
        
        private ThreadLocal<FTPClient> ftpClientThreadLocal = new ThreadLocal<FTPClient>();
        
        private String encoding = "UTF-8";    
        private int clientTimeout = 1000 * 30;
        private boolean binaryTransfer = true;
        
        private String host;
        private int port;
        private String username;
        private String password;
        
        private FTPClient getFTPClient() {
            if (ftpClientThreadLocal.get() != null && ftpClientThreadLocal.get().isConnected()) {
                return ftpClientThreadLocal.get();
            } else {
                FTPClient ftpClient = new FTPClient(); // 构造一个FtpClient实例
                ftpClient.setControlEncoding(encoding); // 设置字符集
    
                try {
                    connect(ftpClient); // 连接到ftp服务器    
                    setFileType(ftpClient); //设置文件传输类型
                    ftpClient.setSoTimeout(clientTimeout);
                } catch (Exception e) {
                    
                    e.printStackTrace();
                }
                
                ftpClientThreadLocal.set(ftpClient);
                return ftpClient;
            }
        }
        
        /**
         * 连接到ftp服务器    
         */
        private boolean connect(FTPClient ftpClient) throws Exception {
            try {
                ftpClient.connect(host, port);
    
                // 连接后检测返回码来校验连接是否成功
                int reply = ftpClient.getReplyCode();
    
                if (FTPReply.isPositiveCompletion(reply)) {
                    //登陆到ftp服务器
                    if (ftpClient.login(username, password)) {                  
                        return true;
                    }
                } else {
                    ftpClient.disconnect();
                    throw new Exception("FTP server refused connection.");
                }
            } catch (IOException e) {
                if (ftpClient.isConnected()) {
                    try {
                        ftpClient.disconnect(); //断开连接
                    } catch (IOException e1) {
                        throw new Exception("Could not disconnect from server.", e1);
                    }
    
                }
                throw new Exception("Could not connect to server.", e);
            }
            return false;
        }
        
        /**
         * 断开ftp连接
         */
        public void disconnect() throws Exception {
            try {
                FTPClient ftpClient = getFTPClient();
                ftpClient.logout();
                if (ftpClient.isConnected()) {
                    ftpClient.disconnect();
                    ftpClient = null;
                }
            } catch (IOException e) {
                throw new Exception("Could not disconnect from server.", e);
            }
        }
        
        /**
         * 设置文件传输类型
         * 
         * @throws FTPClientException
         * @throws IOException
         */
        private void setFileType(FTPClient ftpClient) throws Exception {
            try {
                if (binaryTransfer) {
                    ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
                } else {
                    ftpClient.setFileType(FTPClient.ASCII_FILE_TYPE);
                }
            } catch (IOException e) {
                throw new Exception("Could not to set file type.", e);
            }
        }
    
        
        //---------------------------------------------------------------------
        // public method
        //---------------------------------------------------------------------
        
        /**
         * 上传一个本地文件到远程指定文件
         * 
         * @param remoteDir 远程文件名(包括完整路径)
         * @param localAbsoluteFile 本地文件名(包括完整路径)
         * @param autoClose 是否自动关闭当前连接
         * @return 成功时,返回true,失败返回false
         * @throws FTPClientException
         */
        public boolean uploadFile(String localAbsoluteFile, String remoteDir, String filename) throws Exception {
            InputStream input = null;
            try {
                getFTPClient().makeDirectory(remoteDir);
                // 处理传输
                input = new FileInputStream(localAbsoluteFile);
                boolean rs = getFTPClient().storeFile(remoteDir+filename, input);
                return rs;
            } catch (FileNotFoundException e) {            
                throw new Exception("local file not found.", e);
            } catch (IOException e) {            
                throw new Exception("Could not put file to server.", e);
            } finally {
                try {
                    if (input != null) {
                        input.close();
                    }
                } catch (Exception e) {
                    throw new Exception("Couldn't close FileInputStream.", e);
                }            
            }
        }
        
        
        
        /***
         * @上传文件夹
         * @param localDirectory  当地文件夹
         * @param remoteDirectoryPath Ftp 服务器路径 以目录"/"结束
         * */
        public boolean uploadDirectory(String localDirectory, String remoteDirectoryPath) {
            File src = new File(localDirectory);
            try {        
                getFTPClient().makeDirectory(remoteDirectoryPath);
                
            } catch (IOException e) {
                e.printStackTrace();
                logger.info(remoteDirectoryPath + "目录创建失败");
            }
                
            File[] allFile = src.listFiles();
            for (int currentFile = 0; currentFile < allFile.length; currentFile++) {
                if (!allFile[currentFile].isDirectory()) {
                    String srcName = allFile[currentFile].getPath().toString();
                    uploadFile(new File(srcName), remoteDirectoryPath);
                }
            }
            for (int currentFile = 0; currentFile < allFile.length; currentFile++) {
                if (allFile[currentFile].isDirectory()) {
                    // 递归
                    uploadDirectory(allFile[currentFile].getPath().toString(),    remoteDirectoryPath);
                }
            }
            return true;
        }
        
        /***
         * 上传Ftp文件 配合文件夹上传     
         * @param localFile 当地文件
         * @param romotUpLoadePath上传服务器路径
         *            - 应该以/结束
         * */
        private boolean uploadFile(File localFile, String romotUpLoadePath) {
            BufferedInputStream inStream = null;
            boolean success = false;
            try {            
                getFTPClient().changeWorkingDirectory(romotUpLoadePath);// 改变工作路径        
                inStream = new BufferedInputStream(new FileInputStream(localFile));
                logger.info(localFile.getName() + "开始上传.....");
                success = getFTPClient().storeFile(localFile.getName(), inStream);
                if (success == true) {
                    logger.info(localFile.getName() + "上传成功");
                    return success;
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                logger.error(localFile + "未找到");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (inStream != null) {
                    try {
                        inStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return success;
        }
        
        
        
        public String[] listNames(String remotePath, boolean autoClose) throws Exception{
            try {
                String[] listNames = getFTPClient().listNames(remotePath);
                return listNames;
            } catch (IOException e) {
                throw new Exception("列出远程目录下所有的文件时出现异常", e);
            } finally {
                if (autoClose) {
                    disconnect(); //关闭链接
                }
            }
        }
            
        public String getEncoding() {
            return encoding;
        }
    
        public void setEncoding(String encoding) {
            this.encoding = encoding;
        }
    
        public int getClientTimeout() {
            return clientTimeout;
        }
    
        public void setClientTimeout(int clientTimeout) {
            this.clientTimeout = clientTimeout;
        }
    
        public String getHost() {
            return host;
        }
    
        public void setHost(String host) {
            this.host = host;
        }
    
        public int getPort() {
            return port;
        }
    
        public void setPort(int port) {
            this.port = port;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public boolean isBinaryTransfer() {
            return binaryTransfer;
        }
    
        public void setBinaryTransfer(boolean binaryTransfer) {
            this.binaryTransfer = binaryTransfer;
        }
        
        
        /**
         * 目标路径 按年月存图片: 201405
         * 限时打折 /scenery/  ticket,  hotel, catering
         * 浪漫之游 /discount/
         * 
         * @param args
         */
        public static void main(String[] args) {
            
            UpFTPClient ftp = new UpFTPClient();
            ftp.setHost("192.168.0.181");
            ftp.setPort(21);
            ftp.setUsername("ftpgt");
            ftp.setPassword("ftpgt");    
                            
            try {
                // 上传整个目录
                ftp.uploadDirectory("F:/tmp/njff/", "/noff/");
                
                // 上传单个文件
                boolean rs = ftp.uploadFile("F:/tmp/njff/02.jpg", "/201301/", "02.jpg");
                System.out.println(">>>>>>> " + rs);
                
                // 列表
                String[] listNames = ftp.listNames("/", true);
                System.out.println(Arrays.asList(listNames));
                
                ftp.disconnect();
                
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
        
    }
  • 相关阅读:
    ES6 Promise的resolved深入理解
    npm 重点小结
    nodemon 基本配置与使用
    CSS 标准发布流程
    HTML表格基础详解
    <linux/init.h>,<linux/module.h>头文件不存在等问题的解决方法
    libcstl中的list没法插入自定义数据
    Linux下C编写基本的多线程socket服务器
    Linux下C连接MySql数据库
    C++实现最基本的LRUCache服务器缓存
  • 原文地址:https://www.cnblogs.com/sunhan/p/3810642.html
Copyright © 2011-2022 走看看