• 从sftp服务器下载文件到本地(工具类)


    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    import java.util.Vector;
    
    import org.apache.commons.io.IOUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelSftp;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.JSchException;
    import com.jcraft.jsch.Session;
    import com.jcraft.jsch.SftpException;
    
    /**
     * 类说明 sftp工具类
     */
    public class SftpUtil {
        private transient Logger log = LoggerFactory.getLogger(this.getClass());
    
        private ChannelSftp sftp;
    
        private Session session;
        /** SFTP 登录用户名 */
        private String username;
        /** SFTP 登录密码 */
        private String password;
        /** 私钥 */
        private String privateKey;
        /** SFTP 服务器地址IP地址 */
        private String host;
        /** SFTP 端口 */
        private int port;
    
        /**
         * 构造基于密码认证的sftp对象
         */
        public SftpUtil(String username, String password, String host, int port) {
            this.username = username;
            this.password = password;
            this.host = host;
            this.port = port;
        }
    
        /**
         * 构造基于秘钥认证的sftp对象
         */
        public SftpUtil(String username, String host, int port, String privateKey) {
            this.username = username;
            this.host = host;
            this.port = port;
            this.privateKey = privateKey;
        }
    
        public SftpUtil() {
        }
    
        /**
         * 连接sftp服务器
         */
        public void login() {
            log.info("开始登录sftp服务器。。。。");
            try {
                JSch jsch = new JSch();
                if (privateKey != null) {
                    jsch.addIdentity(privateKey);// 设置私钥
                }
    
                session = jsch.getSession(username, host, port);
    
                if (password != null) {
                    session.setPassword(password);
                }
                Properties config = new Properties();
                config.put("StrictHostKeyChecking", "no");
    
                session.setConfig(config);
                session.connect();
    
                Channel channel = session.openChannel("sftp");
                channel.connect();
    
                sftp = (ChannelSftp) channel;
            } catch (JSchException e) {
                log.info("开始登录sftp服务器。。。。失败" + e.getMessage());
                e.printStackTrace();
            }
            log.info("登录sftp服务器。。。。成功");
        }
    
        /**
         * 关闭连接 server
         */
        public void logout() {
            if (sftp != null) {
                if (sftp.isConnected()) {
                    sftp.disconnect();
                }
            }
            if (session != null) {
                if (session.isConnected()) {
                    session.disconnect();
                }
            }
        }
    
        /**
         * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory
         * 
         * @param basePath
         *            服务器的基础路径
         * @param directory
         *            上传到该目录
         * @param sftpFileName
         *            sftp端文件名
         * @param in
         *            输入流
         */
        public void upload(String basePath, String directory, String sftpFileName, InputStream input) throws SftpException {
            try {
                sftp.cd(basePath);
                sftp.cd(directory);
            } catch (SftpException e) {
                // 目录不存在,则创建文件夹
                String[] dirs = directory.split("/");
                String tempPath = basePath;
                for (String dir : dirs) {
                    if (null == dir || "".equals(dir))
                        continue;
                    tempPath += "/" + dir;
                    try {
                        sftp.cd(tempPath);
                    } catch (SftpException ex) {
                        sftp.mkdir(tempPath);
                        sftp.cd(tempPath);
                    }
                }
            }
            sftp.put(input, sftpFileName); // 上传文件
        }
    
        /**
         * 下载文件。
         * 
         * @param directory
         *            下载目录
         * @param downloadFile
         *            下载的文件
         * @param saveFile
         *            存在本地的路径
         */
        public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException {
            log.info("directory===" + directory + ",downloadFile=" + downloadFile + ",saveFile=" + saveFile);
            if (directory != null && !"".equals(directory)) {
                sftp.cd(directory);
            }
            File file = new File(saveFile + downloadFile);
            // sftp.get(directory+downloadFile, saveFile+downloadFile);
            sftp.get(downloadFile, saveFile + downloadFile);
            // sftp.get(downloadFile, new FileOutputStream(file));
        }
    
        /**
         * 下载文件
         * 
         * @param directory
         *            下载目录
         * @param downloadFile
         *            下载的文件名
         * @return 字节数组
         */
        public byte[] download(String directory, String downloadFile) throws SftpException, IOException {
            if (directory != null && !"".equals(directory)) {
                sftp.cd(directory);
            }
            InputStream is = sftp.get(downloadFile);
            byte[] fileData = IOUtils.toByteArray(is);
            return fileData;
        }
    
        /**
         * 删除文件
         * 
         * @param directory
         *            要删除文件所在目录
         * @param deleteFile
         *            要删除的文件
         */
        public void delete(String directory, String deleteFile) throws SftpException {
            // sftp.cd(directory);
            sftp.rm(deleteFile);
        }
    
        /**
         * 列出目录下的文件
         * 
         * @param directory
         *            要列出的目录
         * @param sftp
         */
        public Vector<?> listFiles(String directory) throws SftpException {
            // System.out.println("directory=="+directory);
            sftp.cd(directory);
            return sftp.ls(directory);
        }
    
        // 上传文件测试
        public static void main(String[] args) throws SftpException, IOException {
            SftpUtil sftp = new SftpUtil("用户名", "密码", "ip地址", 22);
            sftp.login();
            File file = new File("D:\\图片\\t0124dd095ceb042322.jpg");
            InputStream is = new FileInputStream(file);
    
            sftp.upload("基础路径", "文件路径", "test_sftp.jpg", is);
            sftp.logout();
        }
    }
    SftpUtil

    使用时需引入依赖的jar包jsch

    相关代码

    #远程系统服务器地址id
    ftp.dt.service.addr=127.0.0.1
    #远程ftp服务器目录,即文件所在目录
    ftp.dt.service.ftpPath=/txt
    #远程ftp服务器连接 端口
    ftp.dt.service.port=33
    #服务器登录名
    ftp.dt.service.name=Administrator
    #登录密码
    ftp.dt.service.pwd=xxx
    #本地存放文件的目录
    ftp.dt.service.localPath=E://xx//
    #dt文件的编码方式
    ftp.dt.service.encoding=gb2312
    配置文件
    public void initDtData(fhycgz e) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
            String thatDate = sdf.format(e.getRq());
    
            String dirPath = fhycgzController.class.getClassLoader().getResource("/").getPath() + File.separator + "conf";
            
            logger.info("根路径.....dirPaht="+dirPath); 
            //home/gzrep/tomcat7/webapps/fdbs/WEB-INF/classes//conf
            Properties p = new Properties();
            
            Boolean downFile = false;
            try {
                //logger.info("开始,获取xx数据 ....."+sdf.format(e.getRq()));
                p.load(new FileInputStream(dirPath + File.separator + "ebos-app.properties"));
                String host = p.getProperty("ftp.dt.service.addr");
                String ftpPath = p.getProperty("ftp.dt.service.ftpPath");
                String username = p.getProperty("ftp.dt.service.name");
                String password = p.getProperty("ftp.dt.service.pwd");
                String localPath = p.getProperty("ftp.dt.service.localPath");
                String encode = p.getProperty("ftp.dt.service.encoding");
                String port = p.getProperty("ftp.dt.service.port");
                logger.info("ftpPath.....="+ftpPath);
                logger.info("localPath.....localPath="+localPath);
                downFile = isSuccessDownload(username, password, host, Integer.parseInt(port), ftpPath, localPath, thatDate);
                //if(downFile){
                //    initLocalData(e, sdf2, thatDate, localPath,encode);
                //}
            } catch (Exception e1) {
                e1.printStackTrace();
                logger.info("初始化失败     ftp服务器连接异常--->=" + e1.getMessage());
            }
    
        }
        
        
            public Boolean isSuccessDownload(String username, String password, String host, int port,String ftpPath,String localPath,String thatDate) {
            logger.info("开始从 xx ftp下载.....");
            Boolean res = false;
            SftpUtil sftp = new SftpUtil(username, password, host, port);
            try {
                sftp.login();  
                Vector<LsEntry> listFiles = (Vector<LsEntry>) sftp.listFiles(ftpPath);
                logger.info("-->xx ftp 目录中文件数...."+listFiles.size());
                
                logger.info("-->开始遍历 xx 目录 中文件....");
                for(LsEntry s:listFiles){
                        String fn = s.getFilename();
    //                    logger.info("-->开始遍历 xx 目录 中文件...."+fn);
                        if (fn.contains(thatDate)) {
                            if(fn.lastIndexOf(".DT~")!=-1||fn.lastIndexOf(".DT")!=-1){
    //                            logger.info("-->>找到包含"+thatDate+"的xx文件-----" +  fn);
                                
                                res = true;
                                File localFile = new File(localPath + File.separator + fn);
                                // 判断本地文件存在就不用在下载了
                                 if(localFile.exists()){
                                     logger.info("-->>文件:" +  fn + " 本地已存在,无须下载" );
                                 }else{
                                     long start = System.currentTimeMillis();
                                     logger.info("-->>下载文件:" +  fn + "开始:" + start);
                                     sftp.download(ftpPath, fn, localPath);
                                     long end = System.currentTimeMillis();
                                     logger.info("-->>下载文件:" +  fn + "结束:" + end+",用时"+(end-start)/1000+"秒");
                                 }
                            }
                    }
                }
                if(!res){
                    logger.info("-->xx中没找到当天的文件...."+thatDate);
                }
                sftp.logout();  
                logger.info("-->遍历 xx目录 中文件....结束");
            } catch (Exception e) {
                e.printStackTrace();
                sftp.logout();  
                res = false;
                new Exception("从服务器下载文件过程中发生错误"+e.getMessage());
                logger.info("-->从服务器下载文件过程中发生错误--"+e.getMessage());
            }
    
            logger.info("结束从 xx ftp下载 .....");
    
            return res;
        }
    读取配置文件并调用工具类下载
  • 相关阅读:
    《软件工艺》-初评
    UI设计心得(1)
    理想生活应该是...
    OpenPOP.NET+OpenSMTP.NET=?最强.NET开源邮件组件 Mail.NET!
    Outlook应用开发(3)之插件引擎
    最近发现的几个酷.net代码
    买了几本新书,推荐一下
    一个游标简单例子
    winform中捕获程序未处理的所有异常
    DataTable的Merge方法和添加datatable到dataset
  • 原文地址:https://www.cnblogs.com/rdchen/p/16195793.html
Copyright © 2020-2023  润新知