Sftp工具类(跨服务器传输)
2023-04-25 16:01:03来源:博客园
(相关资料图)
1 package com.damddos.waf.utils; 2 3 import com.jcraft.jsch.*; 4 import org.apache.commons.io.IOUtils; 5 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.nio.charset.Charset; 9 import java.util.Properties; 10 11 /** 12 * sftp工具类 13 * 14 * @author liYang 15 * @date 2023/04/10 16 */ 17 public class SftpUtil { 18 private static JSch jsch; 19 private static Session session = null; 20 private static Channel channel = null; 21 private static ChannelSftp channelSftp = null; 22 23 //服务器用户名 24 private String ftpUserName; 25 26 //服务器密码 27 private String ftpPassword; 28 29 //服务器ip 30 private String ftpHost; 31 32 //服务器端口 33 private String ftpPort; 34 35 public SftpUtil() { 36 } 37 38 public SftpUtil(String ftpUserName, String ftpPassword, String ftpHost, String ftpPort) { 39 this.ftpUserName = ftpUserName; 40 this.ftpPassword = ftpPassword; 41 this.ftpHost = ftpHost; 42 this.ftpPort = ftpPort; 43 } 44 45 /** 46 * 开启连接 47 */ 48 public ChannelSftp connect() { 49 jsch = new JSch(); 50 try { 51 // 根据用户名、主机ip、端口号获取一个Session对象 52 session = jsch.getSession(ftpUserName, ftpHost, Integer.valueOf(ftpPort)); 53 // 设置密码 54 session.setPassword(ftpPassword); 55 Properties config = new Properties(); 56 config.put("StrictHostKeyChecking", "no"); 57 // 为Session对象设置properties 58 session.setConfig(config); 59 // 设置连接超时为5秒 60 session.setTimeout(100 * 50); 61 // 通过Session建立连接 62 session.connect(); 63 // 打开SFTP通道 64 channel = session.openChannel("sftp"); 65 // 建立SFTP通道的连接 66 channel.connect(); 67 channelSftp = (ChannelSftp) channel; 68 } catch (JSchException e) { 69 e.printStackTrace(); 70 } 71 return channelSftp; 72 } 73 74 /** 75 * 关闭连接 76 */ 77 public void close() { 78 if (channel != null) { 79 channel.disconnect(); 80 } 81 if (session != null) { 82 session.disconnect(); 83 } 84 } 85 86 /** 87 * 判断文件夹路径是否存在 88 * 89 * @param directory 文件夹路径,如:/root/test/saveFile/ 90 */ 91 public boolean isDirExist(String directory) { 92 directory = null != directory && directory.endsWith("/") ? directory : directory + "/"; 93 boolean dirExist = false; 94 try { 95 SftpATTRS sftpATTRS = channelSftp.lstat(directory); 96 dirExist = sftpATTRS.isDir(); 97 } catch (Exception e) { 98 if (e.getMessage().equalsIgnoreCase("no such file")) { 99 dirExist = false;100 }101 }102 return dirExist;103 }104 105 /**106 * 创建一个文件夹(若整个路径都不存在会依次创建,若改路径已经存在则不会创建)107 *108 * @param createpath 要创建的文件夹路径,如:/root/test/saveFile/109 * @throws SftpException110 */111 public void createDir(String createpath) {112 createpath = null != createpath && createpath.endsWith("/") ? createpath : createpath + "/";113 if (!isDirExist(createpath)) {114 StringBuilder builder = new StringBuilder("/");115 String pathArry[] = createpath.split("/");116 for (String dir : pathArry) {117 if (!dir.equals("")) {118 builder.append(dir);119 builder.append("/");120 try {121 String path = builder.toString();122 if (!isDirExist(path)) {123 // 建立目录124 channelSftp.mkdir(path);125 }126 } catch (SftpException e) {127 e.printStackTrace();128 }129 }130 }131 }132 }133 134 /**135 * 删除文件136 *137 * @param deleteFile 要删除的文件路径,如:/root/test/saveFile/mylog.log138 */139 public void deleteFile(String deleteFile) {140 try {141 channelSftp.rm(deleteFile);142 } catch (Exception e) {143 e.printStackTrace();144 }145 }146 147 /**148 * 文件上传149 *150 * @param fileStram 文件输入流151 * @param upToPath 要上传到的文件夹路径152 * @param fileName 上传后的文件名153 */154 public void uploadFile(InputStream fileStram, String upToPath, String fileName) {155 upToPath = null != upToPath && upToPath.endsWith("/") ? upToPath : upToPath + "/";156 try {157 channelSftp.put(fileStram, upToPath + fileName);158 } catch (SftpException e) {159 e.printStackTrace();160 }161 }162 163 /**164 * 文件下载165 *166 * @param downlownPath 要下载的文件的所在文件夹路径167 * @param fileName 文件名168 * @return download 返回下载的文件流169 */170 public InputStream downloadFile(String downlownPath, String fileName) {171 downlownPath = null != downlownPath && downlownPath.endsWith("/") ? downlownPath : downlownPath + "/";172 InputStream download = null;173 try {174 download = channelSftp.get(downlownPath + fileName);175 } catch (SftpException e) {176 e.printStackTrace();177 }178 return download;179 }180 181 182 /**183 * 执行linux命令184 *185 * @param order 要执行的命令,(如,打印指定目录下的文件信息: ls -a /usr/local/kkFileView/kkFileView-4.0.0/bin/)186 * @return result 执行后返回的结果187 */188 public String excutOrder(String order) {189 String result = "";190 try {191 ChannelExec channelExec = (ChannelExec) session.openChannel("exec");192 channelExec.setCommand(order);193 channelExec.setErrStream(System.err);194 channelExec.connect();195 InputStream in = channelExec.getInputStream();196 result = IOUtils.toString(in, Charset.defaultCharset());197 } catch (JSchException e) {198 e.printStackTrace();199 } catch (IOException e) {200 e.printStackTrace();201 }202 return result;203 }204 205 }
项目需要。
本网推荐
- Sftp工具类(跨服务器传输)
- iCAR 03更多信息露出:支持太阳能充电_环球新视野
- “我帮办”“我代办”“我来办” 孝昌“首席服务员”上岗
- 全球速看:大城之变 | 北京最大“绿肺”公园,前身竟是砂石厂
- 世界快报:海外石英砂公司尤尼明宣布扩产,欧晶科技连续两日跌停
- 环球今亮点!现代全科医学杂志_关于现代全科医学杂志介绍
- 重磅!宁王的钠离子电池真的来了|简讯
- 我国四大作物试行实质性派生品种制度
- 焦点日报:首次实现枪击不起火,埃安弹匣电池2.0解决多项电池安全问题
- 环球今热点:方圆几里这首歌的真正含义_薛之谦的歌方圆几里真正所表达的含义是什么意思
- 4799元 联想小新轻薄本2023西子绿预售:2.2K四窄边护眼屏-短讯
- 世界今日讯!港股异动|海信家电(00921)早盘涨超3% 机构称家电行业有望受益AI技术发展
- 力盛体育(002858):数字化业务破圈 赛车升级大体育领域 世界视点
- 环球聚焦:《窃听风暴》导演:电影不需要任何无聊的时刻
- 环球百事通!港股概念追踪 | 欧洲九国拟扩大北海风力发电 国内企业海外订单有望快速增长(附概念股)
- 全球热点!医保卡里的钱可以取吗?要怎么使用?
- 好险!14岁孩子一时冲动喝下剧毒,市妇儿医院全力以赴救回轻生少年
- 科理咨询2022年净利118.06万 同比减少84.71% 部份客户项目因疫情暂缓或延迟
- 【世界播资讯】2023年安庆市办理退休手续需要准备哪些资料
- 全力避免购房者“钱房两空”
- 斗气王妃十五岁漫画全集_斗气王妃十五岁 世界观焦点
- 继境外债重组初步方案之后 旭辉再抛境内债展期方案
- 当前热点-搓麻“高手”突变“菜鸟” 原是脑里长了瘤子
- 神头发电公司着力护航机组安全稳定运行 新资讯
- 3家公司发布定增相关公告 东方材料拟定增不超20亿元
- 【环球报资讯】“光耀申城”行动计划启动 上海建设“光纤到房间第一城”
- 中国黄金协会:一季度我国黄金消费量291.58吨,同比增长12.03% 世界热推荐
- 天天播报:山东省首届老年医学能力与应急处置竞赛成功举办
- 天天播报:快讯:港股恒指低开0.28%,科技股集体走低,新特能源跌逾5%
- 巴基斯坦一反恐警局发生火灾引发爆炸 数十人伤亡