sftp java 上传

Posted rocky-fang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sftp java 上传相关的知识,希望对你有一定的参考价值。

1. 注意问题

 uri的格式: sftp://zhangsan:[email protected]:22

 dir问题 : 判断有没有 没有创建 然后进入 类推

 config问题: StrictHostKeyChecking=no

 进度问题 : 需要变量保存

2. 代码

    private void transfer_sftp(String attrPath, Element groupNode, long size) throws JSchException, SftpException, UnsupportedEncodingException{
        attrPath = attrPath.replaceAll("sftp://", "");
        String[] tmps = attrPath.split(":");
        String dstUserName = tmps[0];
        int port = 22;
        String portstr = tmps[2].replaceAll("/", "");
        try {
            port = Integer.parseInt(portstr);
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        String[] tmp = tmps[1].split("@");
        String dstPassword = tmp[0];
        String sftpIP = tmp[1];
        List<?> files = groupNode.selectNodes("File");
        for(int k=0; k<files.size(); k++){
            JSch jsch = new JSch();
            Session session = jsch.getSession(dstUserName, sftpIP, port);
            logger.info("JSch Session created: user:"+dstUserName + ",password="+dstPassword+",sftpIP="+sftpIP+",port="+port);
            session.setPassword(dstPassword);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            session.setConfig(sshConfig);
            session.connect();
            logger.info("JSch Session connected > user:"+dstUserName);
            ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
            channelSftp.connect();
            logger.info("Connected to "+ sftpIP);
            Element file = (Element) files.get(k);
            String srcFilePath = file.elementText("SrcFileName");
            String dstFilePath = file.elementText("DstFileName");
            logger.info("upload file on sftp protocol >> srcFilePath="+srcFilePath + ",dstFilePath="+dstFilePath);
            int index = dstFilePath.lastIndexOf("/");
            String path = dstFilePath.substring(0, index + 1);
            String filename = dstFilePath.substring(index + 1, dstFilePath.length());
            if (path.startsWith("/"))
                path = path.substring(1);
            logger.info("dest path:"+path);
            if (filename.startsWith("/"))
                filename = filename.substring(1);
            String[] pathArray = path.split("/");
            for (String pathStr : pathArray) {
                try {
                    logger.info("channelsftp dir ::"+pathStr);
                    Vector ls = channelSftp.ls(pathStr);
                    if(ls != null){
                        channelSftp.cd(pathStr);
                    }
                } catch (Exception e) {
                    logger.info("channelsftp catch mkdir ::"+pathStr);
                    channelSftp.mkdir(pathStr);
                    channelSftp.cd(pathStr);
                    e.printStackTrace();
                }
            }
//            String dir = new String(path.getBytes("gb2312"), "iso-8859-1");
//            String destName = new String(filename.getBytes("gb2312"), "iso-8859-1");
//            System.out.println("上传目录名名:::"+dir);
//            System.out.println("上传后文件名:::"+destName);
//            channelSftp.put(srcFilePath, dstFilePath, new SftpProgressMonitor() {
            channelSftp.put(srcFilePath, filename, new SftpProgressMonitor() {
                
                long n = 0L;
                long _max = 0L;
                
                public long getN() {
                    return n;
                }

                public void setN(long n) {
                    this.n = n;
                }

                @Override
                public void init(int arg0, String arg1, String arg2, long max) {
                    this._max = max;
                    logger.info("SFTP Transferring begin....._max="+_max);
                }
                
                @Override
                public void end() {
                    logger.info("SFTP Transferring end....");
                }
                
                @Override
                public boolean count(long count) {
                    n += count;
//                    logger.info("SFTP Transferring  count="+count+",n="+n);
                    if(_max!=0){
                        run_progress = (int) ((n*100)/_max);
//                        logger.info("the progress of upload file through sftp :" + run_progress + "%");
                    }
                    return true;
                }
            }, ChannelSftp.OVERWRITE);
            channelSftp.quit();
            session.disconnect();
            
        }
    }

 

以上是关于sftp java 上传的主要内容,如果未能解决你的问题,请参考以下文章

sftp java 上传

我的代码库-Java8实现FTP与SFTP文件上传下载

java怎么实现SFTP上传文件夹,包括整个目录?

jsch连接sftp后连接未释放掉问题排查

Java Sftp上传下载文件

java向SFTP服务器上传文件,如何判断服务器上的文件夹是不是存在?