从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;
    }
读取配置文件并调用工具类下载

 

posted @ 2022-04-26 17:47  爱跳舞的程序员  阅读(704)  评论(0编辑  收藏  举报