package com.osplat.util;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Vector;import org.apache.commons.lang3.StringUtils;import org.apache.commons.lang3.SystemUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.jcraft.jsch.Channel;import com.jcraft.jsch.ChannelSftp;import com.jcraft.jsch.ChannelSftp.LsEntry;import com.jcraft.jsch.JSch;import com.jcraft.jsch.JSchException;import com.jcraft.jsch.Session;import com.jcraft.jsch.SftpException;

/** *  linus文件下载 * @author Administrator * @date */public class SftpManager {    private static final Logger logger = LoggerFactory.getLogger(SftpManager.class);    public static final String SFTP_PROTOCAL = "sftp";

    public static void main(String[] args) throws Exception {        ChannelSftp sftp=null;        sftp=connect("111.111.1.11", "root", "123456", 22);        List<String> listFiles=listFiles(sftp, "/home/numa/image", null);        downloadFileList(sftp, "/home/numa/image", "E:\\picture", listFiles);        disconnect(sftp);

    }

    /**     *     * @param host     *            IP地址     * @param username     *            用户名     * @param password     *            密码     * @param port     *            端口号     * @return     * @throws Exception     */    public static ChannelSftp connect(String host, String username, String password, int port) throws Exception {        Channel channel = null;        ChannelSftp sftp = null;        JSch jsch = new JSch();        Session session = createSession(jsch, host, username, port);        // 设置登陆主机的密码        session.setPassword(password);        // 设置登陆超时时间        session.connect(15000);        logger.info("Session connected to " + host + ".");        try {            // 创建sftp通信通道            channel = (Channel) session.openChannel(SFTP_PROTOCAL);            channel.connect(1000);            logger.info("Channel created to " + host + ".");            sftp = (ChannelSftp) channel;        } catch (JSchException e) {            logger.error("exception when channel create.", e);        }        return sftp;    }

    public static void upload(ChannelSftp sftp, String srcFile, String dest) {        try {            File file = new File(srcFile);            if (file.isDirectory()) {                sftp.cd(srcFile);                for (String fileName : file.list()) {                    sftp.put(srcFile + SystemUtils.FILE_SEPARATOR + fileName, dest);                }            }            sftp.put(srcFile, dest);        } catch (Exception e) {            e.printStackTrace();        }    }

    public static void upload(ChannelSftp sftp, List<String> fileList, String destPath) throws SftpException {        try {            sftp.cd(destPath);        } catch (Exception e) {            sftp.mkdir(destPath);        }        for (String srcFile : fileList) {            upload(sftp, srcFile, destPath);        }    }

    /**     *     * @param     * @param srcPath     *            服务器上源文件的路径, 必须是目录     * @param saveFile     *            下载后文件的存储路径, 若为目录, 则文件名将与目标服务器上的文件名相同     * @param srcfile     *            目标服务器上的文件, 不能为目录     */    public static void download(ChannelSftp sftp, String srcPath, String saveFile, String srcfile) {        try {            sftp.cd(srcPath);            File file = new File(saveFile);            if (file.isDirectory()) {                sftp.get(srcfile, new FileOutputStream(file + SystemUtils.FILE_SEPARATOR + srcfile));            } else {                sftp.get(srcfile, new FileOutputStream(file));            }        } catch (Exception e) {            logger.error("download file: {} error", srcPath + SystemUtils.FILE_SEPARATOR + srcfile, e);        }    }

    /**     * 使用sftp下载目标服务器上某个目录下指定类型的文件, 得到的文件名与 sftp服务器上的相同     *     * @param sftp     * @param srcPath     *            sftp服务器上源目录的路径, 必须是目录     * @param savePath     *            下载后文件存储的目录路径, 一定是目录, 如果不存在则自动创建     * @param fileTypes     *            指定类型的文件, 文件的后缀名组成的字符串数组     */    public static void download(ChannelSftp sftp, String srcPath, String savePath, String... fileTypes) {        List<String> fileList = new ArrayList<String>();        try {            sftp.cd(srcPath);            createDir(savePath);            if (fileTypes.length == 0) {                // 列出服务器目录下所有的文件列表                fileList = listFiles(sftp, srcPath, "*");                downloadFileList(sftp, srcPath, savePath, fileList);                return;            }            for (String type : fileTypes) {                fileList = listFiles(sftp, srcPath, "*" + type);                parseAndUpdateDB(sftp, srcPath, savePath, fileList);            }        } catch (Exception e) {            logger.error(                    "download all file in path = '" + srcPath + "' and type in " + Arrays.asList(fileTypes) + " error",                    e);        }    }

    private static File createDir(String savePath) throws Exception {        File localPath = new File(savePath);        if (!localPath.exists() && !localPath.isFile()) {            if (!localPath.mkdir()) {                throw new Exception(localPath + " directory can not create.");            }        }        return localPath;    }

    /**     * sftp下载目标服务器上srcPath目录下所有指定的文件.<br/>     * 若本地存储路径下存在与下载重名的文件,仍继续下载并覆盖该文件.<br/>     *     * @param sftp     * @param srcPath     * @param savePath     *            文件下载到本地存储的路径,必须是目录     * @param fileList     *            指定的要下载的文件名列表     * @throws SftpException     * @throws FileNotFoundException     */    public static void downloadFileList(ChannelSftp sftp, String srcPath, String savePath, List<String> fileList)            throws SftpException, FileNotFoundException {        sftp.cd(srcPath);        for (String srcFile : fileList) {            logger.info("srcFile: " + srcFile);            String localPath = savePath + SystemUtils.FILE_SEPARATOR + srcFile;            sftp.get(srcFile, localPath);        }    }

    /**     * sftp下载目标服务器上所有指定的文件, 并解析文件的内容.<br/>     * 若本地存储路径下存在与下载重名的文件, 则忽略(不下载)该文件.<br/>     *     * @param sftp     * @param srcPath     *            sftp上源文件的目录     * @param savePath     *            文件下载到本地存储的路径,必须是目录     * @param fileList     *            指定的要下载的文件列表     * @throws FileNotFoundException     * @throws SftpException     */    private static void parseAndUpdateDB(ChannelSftp sftp, String srcPath, String savePath, List<String> fileList)            throws FileNotFoundException, SftpException {        sftp.cd(srcPath);        for (String srcFile : fileList) {            String localPath = savePath + SystemUtils.FILE_SEPARATOR + srcFile;            File localFile = new File(localPath);            // savePath路径下已有文件与下载文件重名, 忽略这个文件            if (localFile.exists() && localFile.isFile()) {                continue;            }            logger.info("start downloading file: [" + srcFile + "], parseAndUpdate to DB");            sftp.get(srcFile, localPath);            // updateDB(localFile);        }    }

    /**     * 获取srcPath路径下以regex格式指定的文件列表     *     * @param sftp     * @param srcPath     *            sftp服务器上的目录     * @param regex     *            需要匹配的文件名     * @return     * @throws SftpException     */    @SuppressWarnings("unchecked")    public static List<String> listFiles(ChannelSftp sftp, String srcPath, String regex) throws SftpException {        List<String> fileList = new ArrayList<String>();        sftp.cd(srcPath); // 如果srcPath不是目录则会抛出异常        if ("".equals(regex) || regex == null) {            regex = "*";        }        Vector<LsEntry> sftpFile = sftp.ls(regex);        String fileName = null;        for (LsEntry lsEntry : sftpFile) {            fileName = lsEntry.getFilename();            fileList.add(fileName);        }        return fileList;    }

    /**     * 删除文件     *     * @param dirPath     *            要删除文件所在目录     * @param file     *            要删除的文件     * @param sftp     * @throws SftpException     */    public static void delete(String dirPath, String file, ChannelSftp sftp) throws SftpException {        String now = sftp.pwd();        sftp.cd(dirPath);        sftp.rm(file);        sftp.cd(now);    }

    /**     * Disconnect with server     *     * @param sftp     */    public static void disconnect(ChannelSftp sftp) {        try {            if (sftp != null) {                if (sftp.isConnected()) {                    sftp.disconnect();                } else if (sftp.isClosed()) {                    logger.info("sftp is closed already");                }                if (null != sftp.getSession()) {                    sftp.getSession().disconnect();                }            }        } catch (JSchException e) {            // Ignore        }    }

    private static Session createSession(JSch jsch, String host, String username, int port) throws Exception {        Session session = null;        if (port <= 0) {            // 连接服务器,采用默认端口            session = jsch.getSession(username, host);        } else {            // 采用指定的端口连接服务器            session = jsch.getSession(username, host, port);        }        // 如果服务器连接不上,则抛出异常        if (session == null) {            throw new Exception(host + "session is null");        }        // 设置第一次登陆的时候提示,可选值:(ask | yes | no)        session.setConfig("StrictHostKeyChecking", "no");        return session;    }

    /**     * Private/public key authorization (加密秘钥方式登陆)     *     * @param username     *            主机登陆用户名(user account)     * @param host     *            主机IP(server host)     * @param port     *            主机ssh登陆端口(ssh port), 如果port<=0, 取默认值22     * @param privateKey     *            秘钥文件路径(the path of key file.)     * @param passphrase     *            密钥的密码(the password of key file.)     * @return     * @throws Exception     */    public static ChannelSftp connect(String username, String host, int port, String privateKey, String passphrase)            throws Exception {        Channel channel = null;        ChannelSftp sftp = null;        JSch jsch = new JSch();        // 设置密钥和密码 ,支持密钥的方式登陆        if (StringUtils.isNotEmpty(privateKey)) {            if (StringUtils.isNotEmpty(passphrase)) {                // 设置带口令的密钥                jsch.addIdentity(privateKey, passphrase);            } else {                // 设置不带口令的密钥                jsch.addIdentity(privateKey);            }        }        Session session = createSession(jsch, host, username, port);        // 设置登陆超时时间        session.connect(15000);        logger.info("Session connected to " + host + ".");        try {            // 创建sftp通信通道            channel = (Channel) session.openChannel(SFTP_PROTOCAL);            channel.connect(1000);            logger.info("Channel created to " + host + ".");            sftp = (ChannelSftp) channel;        } catch (JSchException e) {            logger.error("exception when channel create.", e);        }        return sftp;    }}

linus jsch文件下载的更多相关文章

  1. jsch文件下载功能

    转载:http://www.cnblogs.com/longyg/archive/2012/06/25/2561332.html 上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch ...

  2. linus jsch上传文件

    package com.osplat.util; import java.io.*; import com.jcraft.jsch.*;import com.osplat.bean.Resultmod ...

  3. 【转】JSch - Java实现的SFTP(文件下载详解篇)

    上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch实现文件下载的功能.并介绍一些SFTP的辅助方法,如cd,ls等.   同样,JSch的文件下载也支持三种传输模式:OVERWRI ...

  4. JSch - Java实现的SFTP(文件下载详解篇)

    上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch实现文件下载的功能.并介绍一些SFTP的辅助方法,如cd,ls等. 同样,JSch的文件下载也支持三种传输模式:OVERWRITE ...

  5. JSch - Java实现的SFTP(文件下载详解篇)(转)

    上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch实现文件下载的功能.并介绍一些SFTP的辅助方法,如cd,ls等.   同样,JSch的文件下载也支持三种传输模式:OVERWRI ...

  6. 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控

    参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html  ...

  7. 【SFTP】使用Jsch实现Sftp文件上传-支持断点续传和进程监控

    JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到 ...

  8. 【转】JSch - Java实现的SFTP(文件上传详解篇)

    JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到 ...

  9. JSch - Java实现的SFTP(文件上传详解篇)

    JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到 ...

随机推荐

  1. fabric读书笔记

    chaincode:一种类似于智能合约的代码,通过执行这个代码与账本交互.chaincode存储在节点上 transaction:一次chaincode的运行过程 contract:满足某个条件下,将 ...

  2. .Net 上传文件和下载文件

    一.上传文件 1.普通的form表单提交 注意点: 请求方式必须为Post. form表单里必须设置enctype属性(enctype = "multipart/form-data" ...

  3. 作为sort()方法的参数的比较函数(高程三第五章)

    <script> var nums = [0,1,5,10,15]; var nums2 = nums; nums.sort(); console.log(nums);//0,1,10,1 ...

  4. SonarQube与Eclipse配合

    Sonar安装 下载Sonar 点击下面网址下载Sonar: http://dist.sonar.codehaus.org/sonar-3.5.1.zip ,下载后解压 解压后安装 解压后你将要看到如 ...

  5. java中常用工具类

    目录 一. org.apache.commons.io.IOUtils 二. org.apache.commons.io.FileUtils 三. org.apache.commons.lang.St ...

  6. 机器学习入门-文本特征-使用LDA主题模型构造标签 1.LatentDirichletAllocation(LDA用于构建主题模型) 2.LDA.components(输出各个词向量的权重值)

    函数说明 1.LDA(n_topics, max_iters, random_state)  用于构建LDA主题模型,将文本分成不同的主题 参数说明:n_topics 表示分为多少个主题, max_i ...

  7. day12-集合

    集合 1.什么是集合 set(集合)是一个无序不重复元素的数据集,与列表的区别1.无序的,不可以使用索引进行顺序的访问2.不能够有重复的数据. 项目开发中,集合主要用在数据元素的去重和测试是否存在.集 ...

  8. GCD 常用API 总结

    dispatch_sync:同步操作,会阻塞当前线程 dispatch_async:普通的异步操作,也就是在指定的队列中添加一个block操作,不会阻塞当前线程 dispatch_group_asyn ...

  9. 高德地图 API 计算两个城市之间的距离

    1. 目前在项目中,遇到一个需求不会做,就是要计算两个城市之间的距离,而这两个城市的输入是可变的,如果要使用数据库来先存储两地之间的距离,调用的时候再来调用,那么存数据的时候,要哭的,因为光是省级区域 ...

  10. Android通过adb命令Debug调试

    Android Debug后IDE执行的命令: / ::: Launching module_app $ adb push C:\fastwork\Projects\project\CJPT\modu ...