java sftp实现上传和下载。
<!-- 包含SFTP功能 --> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.54</version> </dependency>
import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; /** * @date 2018年3月20日 下午10:26:54 * @doc sftp工具类 , 实现【本地到服务器】文件 【上传和下载】 * @依赖包 <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> * <version>0.1.55</version> </dependency> */ public class SftpUtil { private static Log log = LogFactory.getLog(SftpUtil.class); private static String FILE = "config/sftp.properties"; private static Session session = null; private static final int timeout = 10000;// 10秒 private static void init() { // 如果有加密,可在此处解密 String user = PropertiesUtils.getProperty(FILE, "sftp.user"); String pass = PropertiesUtils.getProperty(FILE, "sftp.pass"); String portStr = PropertiesUtils.getProperty(FILE, "sftp.port"); String ip = PropertiesUtils.getProperty(FILE, "sftp.ip"); Integer port = null; if (portStr != null && !"".equals(portStr)) { port = Integer.parseInt(portStr); } try { JSch jsch = new JSch(); if (port <= 0 || port == null) {// 连接服务器,采用默认端口:默认22 session = jsch.getSession(user, ip); } else { // 采用指定的端口连接服务器 session = jsch.getSession(user, ip, port); } // 如果服务器连接不上,则抛出异常 if (session == null) { log.info("session is null"); return; } // 设置登陆超时时间 5秒 session.connect(timeout); // 设置登陆主机的密码 session.setPassword(pass);// 设置密码 // 设置第一次登陆的时候提示,可选值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); } catch (Exception e) { log.error("SFTPUtil.init.exception1", e); } } /** * @param src * 服务器中的文件名:a.jpg * @param dest * 目的地的文件名称 ,带路径:E:/a.jpg * @param tempPath * 服务器路径 */ public static void downloadFile(String src, String dest) { if (session == null) { init(); } Channel channel = null; try { channel = (Channel) session.openChannel("sftp"); channel.connect(timeout); ChannelSftp sftp = (ChannelSftp) channel; // 进入服务器指定的文件夹 sftp.get(src, dest); // 下载 sftp.quit(); sftp.disconnect(); } catch (Exception e) { log.error("SFTPUtil.uploadFile.exception1", e); } finally { if (channel != null) { channel.disconnect(); } } } public static void downloadFile(String src, OutputStream output) { if (session == null) { init(); } Channel channel = null; try { channel = (Channel) session.openChannel("sftp"); channel.connect(timeout); ChannelSftp sftp = (ChannelSftp) channel; // 进入服务器指定的文件夹 sftp.get(src, output);// 下载 sftp.quit(); sftp.disconnect(); } catch (Exception e) { log.error("SFTPUtil.uploadFile.exception1", e); } finally { if (channel != null) { channel.disconnect(); } } } /** * @param is * 文件输入流 * @param dest * 文件名称 a.jpg * @param tempPath * 路径 */ public static void uploadFile(InputStream is, String dest) { if (session == null) { init(); } Channel channel = null; try { channel = (Channel) session.openChannel("sftp"); channel.connect(timeout); ChannelSftp sftp = (ChannelSftp) channel; sftp.put(is, dest); // 上传 sftp.quit(); sftp.disconnect(); } catch (Exception e) { log.error("SFTPUtil.uploadFile.exception1", e); } finally { if (channel != null) { channel.disconnect(); } } } /** * 上传文件 * * @param src * 源文件地址 abc.jpg * @param dest * 目标地址 abc1.jpg * @param tempPath * 中间层目录 /usr/local/nginx/html/ abc.jpg * @throws JSchException */ public static void uploadFile(String src, String dest) { if (session == null) { init(); } Channel channel = null; try { channel = (Channel) session.openChannel("sftp"); channel.connect(timeout); ChannelSftp sftp = (ChannelSftp) channel; sftp.put(src, dest); sftp.quit(); sftp.disconnect(); } catch (Exception e) { log.error("SFTPUtil.uploadFile.exception1", e); } finally { if (channel != null) { channel.disconnect(); } } } /** * 模版 : 使用输入输出流 * * 利用JSch包实现SFTP下载、上传文件 * * @param ip * 主机IP * @param user * 主机登陆用户名 * @param psw * 主机登陆密码 * @param port * 主机ssh2登陆端口,如果取默认值,传-1 */ @SuppressWarnings("unused") private static void sshSftp(String ip, String user, String pass, int port) throws Exception { Session session = null; Channel channel = null; JSch jsch = new JSch(); if (port <= 0) { // 连接服务器,采用默认端口:默认22 session = jsch.getSession(user, ip); } else { // 采用指定的端口连接服务器 session = jsch.getSession(user, ip, port); } // 如果服务器连接不上,则抛出异常 if (session == null) { throw new Exception("session is null"); } // 设置登陆主机的密码 session.setPassword(pass);// 设置密码 // 设置第一次登陆的时候提示,可选值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); // 设置登陆超时时间 session.connect(timeout); try { // 创建sftp通信通道 channel = (Channel) session.openChannel("sftp"); channel.connect(1000); ChannelSftp sftp = (ChannelSftp) channel; // 进入服务器指定的文件夹 sftp.cd("/usr/local/nginx/html"); // 列出服务器指定的文件列表 Vector<?> v = sftp.ls("*");// "*.txt" for (int i = 0; i < v.size(); i++) { System.out.println(v.get(i)); } // 以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了 OutputStream outstream = sftp.put("1117.jpg"); InputStream instream = new FileInputStream(new File("E:/IMG/7.jpg")); byte b[] = new byte[1024]; int n; while ((n = instream.read(b)) != -1) { outstream.write(b, 0, n); } outstream.flush(); outstream.close(); instream.close(); } catch (Exception e) { e.printStackTrace(); } finally { session.disconnect(); channel.disconnect(); } } public static void main(String[] args) { // String src = "E:/kare20.png" ; // String dest = "kare.png"; // uploadFile(src, dest); String src = "D:/张三.jpg"; String dest = "/usr/local/images/advert/999.jpg"; uploadFile(src, dest); } }
#SFTP相关配置 # 主机IP sftp.ip=192.168.8.111 # 用户 sftp.user=dev # 密码 sftp.pass=dev123 # 端口;默认22 sftp.port=22 # 默认路径 sftp.path=/usr/local/nginx/html