SFTP和Channel

SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP为SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

1.实现依赖Jsch-0.1.54.jar

可以在mvn repository 依赖到项目来,我使用的依赖如下:

<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.54</version>
</dependency>

2.引入Jar包之后,我们就先可配置化我们SFTP的一些参数

新建 config.properties

work order photo SFTP config.

sftp.ip=10.32.233.111
sftp.port=22
sftp.userName=root
sftp.password=kaifa123
sftp.timeout=60000
sftp.src=D:\ftpLocalFile
sftp.dst= /opt/soft/sftp/
sftp.retryTime=3
@see ConfigEntity#getSftpXXX() 方法将从config.properties文件读取相应配置信息

3.封装创建获得SFTP服务器的连接的方法及释放连接的方法

解释一下SFTP的整个调用过程,这个过程就是通过Ip、Port、Username、Password获取一个Session,然后通过Session打开SFTP通道(获得SFTP Channel对象),再在建立通道(Channel)连接,最后我们就是通过这个Channel对象来调用SFTP的各种操作方法.总是要记得,我们操作完SFTP需要手动断开Channel连接与Session连接。

直接贴相应的方法代码:
    /**
     * 获得SFTP Channel
     * @return ChannelSftp Instance
     * @throws JSchException
     */
    public ChannelSftp getChannel() throws JSchException {
        String ftpHost = config.getSftpIp();
        int ftpPort = config.getSftpPort();
        String ftpUserName = config.getSftpUserName();
        String ftpPassword = config.getSftpPassword();
        // 创建JSch对象
        JSch jsch = new JSch();
        // 根据用户名,主机ip,端口获取一个Session对象
        session = jsch.getSession(ftpUserName, ftpHost, ftpPort);
        //logger.info("Session created.");
        if (ftpPassword != null) {
            // 设置密码
            session.setPassword(ftpPassword);
        }
        Properties configTemp = new Properties();
        configTemp.put("StrictHostKeyChecking", "no");
        // 为Session对象设置properties
        session.setConfig(configTemp);
        // 设置timeout时间
        session.setTimeout(config.getSftpTimeout());
        session.connect();
        // 通过Session建立链接
        // 打开SFTP通道
        channel = session.openChannel("sftp");
        // 建立SFTP通道的连接
        channel.connect();
        logger.info("Connected successfully to ftpHost = " + ftpHost + ",as ftpUserName = " + ftpUserName + ", returning: " + channel);
        return (ChannelSftp) channel;
    }

    /**
     * 断开SFTP Channel、Session连接
     * @throws Exception
     */
    public void closeChannel() throws Exception {
        if (channel != null) {
            channel.disconnect();
        }
        if (session != null) {
            session.disconnect();
        }
        logger.info("disconnected SFTP successfully!");
    }

    @Autowired
    private ConfigEntity config; //Ignore this

4.调用代码示例

ChannelSftp chSftp = getChannel();
// 本地文件名
String src = config.getSftpLocalPath() + orderPhoto.getNewPhotoName();
// 目标文件名
String dst = config.getSftpDstPath() + orderPhoto.getNewPhotoName();
chSftp.put(src, dst, ChannelSftp.OVERWRITE);
chSftp.quit();
closeChannel();

Jsch-0.1.54.jar 学习了解

ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如:
文件上传put(),文件下载get(),进入指定目录cd().
得到指定目录下的文件列表ls().
重命名指定文件或目录rename().
删除指定文件rm(),创建目录mkdir(),删除目录rmdir().
大家引用方法时可以快速参考一下,具体传参需参考源码~

最后还要提一下的就是JSch支持的三种文件传输模式:

  • APPEND 追加模式,如果目标文件已存在,传输的文件将在目标文件后追加。
  • RESUME 恢复模式,如果文件已经传输一部分,这时由于网络或其他任何原因导致文件传输中断,如果下一次传输相同的文件,则会从上一次中断的地方续传。
  • OVERWRITE 完全覆盖模式,这是JSch的默认文件传输模式,即如果目标文件已经存在,传输的文件将完全覆盖目标文件,产生新的文件。

——–End Learning———-

二、Java实现FTP文件上传(一般是Windows使用)

直接上代码
/**
 * 连接到服务器
 * @return true 连接服务器成功,false 连接服务器失败
 */
    public boolean connectServer() {
        boolean flag = true;
        if (ftpClient == null) {
            int reply;
            try {
                if(true){
                    ftpClient = new FTPClient();
                    ftpClient.connect(config.getFtpIp(),config.getFtpPort());
                    ftpClient.login(config.getFtpUserName(), config.getFtpPassword());
                    reply = ftpClient.getReplyCode();
                    ftpClient.setDataTimeout(60000);
                    if (!FTPReply.isPositiveCompletion(reply)) {
                        ftpClient.disconnect();
                        logger.info("FTP server refuse connect!");
                        flag = false;
                    }
                }else{
                    flag = false;
                }
            } catch (SocketException e) {
                flag = false;
                e.printStackTrace();
                logger.info("Login ftp server " + config.getFtpIp() + " failed,connect timeout!");
                logger.error("Login ftp server " + config.getFtpIp() + " failed",e);
            } catch (IOException e) {
                flag = false;
                e.printStackTrace();
                logger.info("Login ftp server  " + config.getFtpIp() + " failed,FTP server couldn't open!");
                logger.error("Login ftp server " + config.getFtpIp() + " failed",e);
            }
        }
        return flag;
    }

    public boolean disConnectServer() {
        boolean flag = true;
        if (ftpClient != null) {
            try{
                ftpClient.logout();
                ftpClient.disconnect();
            }catch (Exception e){
                flag = false;
                logger.info("Disconnect ftp server  " + config.getFtpIp() + " failed!");
                logger.error("Disconnect ftp server  " + config.getFtpIp() + " failed",e);
            }
        }
        return flag;
    }

    /**
     * @param remoteFile
     * @param localFile
     * @return
     * @throws IOException
     */
    public boolean uploadFile(String remoteFile, File localFile)
            throws IOException {
        boolean flag = false;
     /*   File file = new File("D://"+UUID.randomUUID()+".jpg");
        if (!file.exists()) {
            file.createNewFile();
        }*/
        InputStream in = new FileInputStream(localFile);
        // IOUtils.copy(in,new FileOutputStream(file));
        //String remote = new String(remoteFile.getBytes("GBK"),"iso-8859-1");
        /*ftpClient.setBufferSize(1024*1024);
        ftpClient.setControlEncoding("utf-8");
        ftpClient.enterLocalPassiveMode();*/
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        ftpClient.changeWorkingDirectory("/picture/pp");
        if (ftpClient.storeFile(remoteFile, in)) {
            flag = true;
            logger.info(localFile.getAbsolutePath() + "upload successfully!");
        } else {
            logger.info(localFile.getAbsolutePath() + "upload failed!");
        }
        in.close();
        return flag;
    }

    /**
     * 上传单个文件,并重命名
     * @param local  --本地文件路径
     * @param remote --本地文件父文件夹路径
     * @return true 上传成功,false 上传失败
     * @throws IOException
     */
    public boolean uploadFile(String local, String remote) throws IOException {
        boolean flag = true;
        String remoteFileName = remote;
        File f = new File(local);
        if (!uploadFile(remoteFileName, f)) {
            flag = false;
        }
        return flag;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352