美文网首页coder
SFTP和Channel

SFTP和Channel

作者: 小灰灰_加油 | 来源:发表于2018-05-20 19:11 被阅读0次

    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;
        }
    

    相关文章

      网友评论

        本文标题:SFTP和Channel

        本文链接:https://www.haomeiwen.com/subject/atitjftx.html