1. 注意问题
uri的格式: sftp://zhangsan:123456@10.10.10.10: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(); } }