1、JSch的引用
1)项目中导入jsch-0.1.53.jar包
下载地址:https://sourceforge.net/projects/jsch/files/jsch/0.1.53/jsch-0.1.53.zip/download
2)Maven中引用的pom.xml配置
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.53</version>
</dependency>
2、JSch连接配置代码
public class SFTP{ private Session session;//会话 private Channel channel;//连接通道 private ChannelSftp sftp;// sftp操作类 public Session getSession() { return session; } public void setSession(Session session) { this.session = session; } public Channel getChannel() { return channel; } public void setChannel(Channel channel) { this.channel = channel; } public ChannelSftp getSftp() { return sftp; } public void setSftp(ChannelSftp sftp) { this.sftp = sftp; } }
public static void getConnect(SFTP s) throws Exception { /** 密钥的密码 */ // String privateKey ="key"; // /** 密钥文件路径 */ // String passphrase ="path"; /** 主机 */ String host ="127.0.0.1"; /** 端口 */ int port =22; /** 用户名 */ String username ="test"; /** 密码 */ String password ="test"; Session session = null; Channel channel = null; ChannelSftp sftp = null;// sftp操作类 JSch jsch = new JSch(); //设置密钥和密码 //支持密钥的方式登陆,只需在jsch.getSession之前设置一下密钥的相关信息 // if (privateKey != null && !"".equals(privateKey)) { // if (passphrase != null && "".equals(passphrase)) { // //设置带口令的密钥 // jsch.addIdentity(privateKey, passphrase); // } else { // //设置不带口令的密钥 // jsch.addIdentity(privateKey); // } // } session = jsch.getSession(username, host, port); session.setPassword(password); Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); // 不验证 HostKey session.setConfig(config); try { session.connect(); } catch (Exception e) { if (session.isConnected()) session.disconnect(); } channel = session.openChannel("sftp"); try { channel.connect(); } catch (Exception e) { if (channel.isConnected()) channel.disconnect(); } sftp = (ChannelSftp) channel; s.setChannel(channel); s.setSession(session); s.setSftp(sftp); } /*断开连接*/ public static void disConn(Session session,Channel channel,ChannelSftp sftp)throws Exception{ if(null != sftp){ sftp.disconnect(); sftp.exit(); sftp = null; } if(null != channel){ channel.disconnect(); channel = null; } if(null != session){ session.disconnect(); session = null; } }
3、使用JSch上传下载删除文件代码
1)上传文件代码
/** * 上传文件 * @param directory 上传的目录-相对于SFPT设置的用户访问目录, * 为空则在SFTP设置的根目录进行创建文件(除设置了服务器全磁盘访问) * @param uploadFile 要上传的文件全路径 */ public static void upload(String directory,String uploadFile) throws Exception { SFTP s=new SFTP(); getConnect(s);//建立连接 Session session = s.getSession(); Channel channel = s.getChannel(); ChannelSftp sftp = s.getSftp();// sftp操作类 try { try{ sftp.cd(directory); //进入目录 }catch(SftpException sException){ if(sftp.SSH_FX_NO_SUCH_FILE == sException.id){ //指定上传路径不存在 sftp.mkdir(directory);//创建目录 sftp.cd(directory); //进入目录 } } } File file = new File(uploadFile); InputStream in= new FileInputStream(file); sftp.put(in, file.getName()); in.close(); } catch (Exception e) { throw new Exception(e.getMessage(),e); } finally { disConn(session,channel,sftp); } }
2)下载文件代码
/** * 下载文件 * @param directory 下载目录 根据SFTP设置的根目录来进行传入 * @param downloadFile 下载的文件 * @param saveFile 存在本地的路径 */ public static void download(String directory, String downloadFile,String saveFile) throws Exception { SFTP s=new SFTP(); getConnect(s);//建立连接 Session session = s.getSession(); Channel channel = s.getChannel(); ChannelSftp sftp = s.getSftp();// sftp操作类 try { sftp.cd(directory); //进入目录 File file = new File(saveFile); boolean bFile; bFile = false; bFile = file.exists(); if (!bFile) { bFile = file.mkdirs();//创建目录 } OutputStream out=new FileOutputStream(new File(saveFile,downloadFile)); sftp.get(downloadFile, out); out.flush(); out.close(); } catch (Exception e) { throw new Exception(e.getMessage(),e); } finally { disConn(session,channel,sftp); } }
3)删除文件代码
/** * 删除文件 * @param directory 要删除文件所在目录 * @param deleteFile 要删除的文件 */ public static void delete(String directory, String deleteFile) throws Exception { SFTP s=new SFTP(); getConnect(s);//建立连接 Session session = s.getSession(); Channel channel = s.getChannel(); ChannelSftp sftp = s.getSftp();// sftp操作类 try { sftp.cd(directory); //要删除的目录的上一级 sftp.rm(deleteFile);//删除目录 } catch (Exception e) { throw new Exception(e.getMessage(),e); } finally { disConn(session,channel,sftp); } }