打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Java代码获取SFTP服务器文件

与下游联调时遇到的问题, 一般我们会使用ftp来传递文件, 因为sftp的传输效率很低. 所以为了兼容,引用了网上的方法.

步骤

  • 导入所需Jar包
  • 编写工具类
  • 代码中运用

 

1. 导入 Jsch-0.1.54.jar

直接去maven库中下载即可 

2. 编写工具类--SFTPUtil.java

  1 /**  2  * @author shansm  3  * @date 2020/3/18 -17:27  4  */  5 public class SFTPUtil {  6   7     private transient Logger log = LoggerFactory.getLogger(this.getClass());  8   9     private ChannelSftp sftp; 10  11     private Session session; 12     /** SFTP 登录用户名*/ 13     private String username; 14     /** SFTP 登录密码*/ 15     private String password; 16     /** 私钥 */ 17     private String privateKey; 18     /** SFTP 服务器地址IP地址*/ 19     private String host; 20     /** SFTP 端口*/ 21     private int port; 22  23  24     /** 25      * 构造基于密码认证的sftp对象 26      */ 27     public SFTPUtil(String username, String password, String host, int port) { 28         this.username = username; 29         this.password = password; 30         this.host = host; 31         this.port = port; 32     } 33  34     /** 35      * 构造基于秘钥认证的sftp对象 36      */ 37     public SFTPUtil(String username, String host, int port, String privateKey) { 38         this.username = username; 39         this.host = host; 40         this.port = port; 41         this.privateKey = privateKey; 42     } 43  44     public SFTPUtil(){} 45  46     /** 47      * 初始化ftp参数 48      * @param resultFileURL 49      */ 50     public SFTPUtil(String resultFileURL , String keys) throws Exception { 51         Map<String, String> map = URLUtil.parseSftp(resultFileURL); 52         init(map.get("ipAddress"),map.get("ipPort"),map.get("userName"),map.get("passWord"),keys); 53         log.info("ip: " map.get("ipAddress")); 54         log.info("port: " map.get("ipPort")); 55         log.info("userName: " map.get("userName")); 56         log.info("PassWord: " map.get("passWord")); 57     } 58  59     /**初始化参数**/ 60     private void init(String ip, String portN, String userName, String passWord,String keys) 61             throws Exception { 62         if(StringUtils.isNotEmpty(portN)){ 63             port=Integer.parseInt(portN); 64         }else{ 65             port = 21; 66         } 67  68         if(StringUtils.isNotEmpty(keys)){ 69             privateKey = keys; 70         } 71  72         host = new String(ip); 73         sftp = new ChannelSftp(); 74         username = new String(userName); 75         password = new String(passWord); 76     } 77  78  79     /** 80      * 连接sftp服务器 81      */ 82     public void login(){ 83         try { 84             JSch jsch = new JSch(); 85             if (privateKey != null) { 86                 jsch.addIdentity(privateKey);// 设置私钥 87             } 88  89             session = jsch.getSession(username, host, port); 90  91             if (password != null) { 92                 session.setPassword(password); 93             } 94             Properties config = new Properties(); 95             config.put("StrictHostKeyChecking", "no"); 96  97             session.setConfig(config); 98             session.connect(); 99 100             Channel channel = session.openChannel("sftp");101             channel.connect();102 103             sftp = (ChannelSftp) channel;104             log.info("登陆 Sftp Server Success");105         } catch (JSchException e) {106             e.printStackTrace();107             log.error(e.getMessage());108         }109     }110 111     /**112      * 关闭连接 server113      */114     public void logout(){115         if (sftp != null) {116             if (sftp.isConnected()) {117                 sftp.disconnect();118             }119         }120         if (session != null) {121             if (session.isConnected()) {122                 session.disconnect();123             }124         }125     }126 127     /**128      * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath directory129      * @param basePath  服务器的基础路径130      * @param directory  上传到该目录131      * @param sftpFileName  sftp端文件名132      */133     public void upload(String basePath,String directory, String sftpFileName, InputStream input) throws SftpException{134         try {135             sftp.cd(basePath);136             sftp.cd(directory);137         } catch (SftpException e) {138             //目录不存在,则创建文件夹139             String [] dirs=directory.split("/");140             String tempPath=basePath;141             for(String dir:dirs){142                 if(null== dir || "".equals(dir)) continue;143                 tempPath ="/" dir;144                 try{145                     sftp.cd(tempPath);146                 }catch(SftpException ex){147                     sftp.mkdir(tempPath);148                     sftp.cd(tempPath);149                 }150             }151         }152         sftp.put(input, sftpFileName);  //上传文件153     }154 155 156     /**157      * 下载文件。158      * @param directory 下载目录159      * @param downloadFile 下载的文件160      * @param saveFile 存在本地的路径161      */162     public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException {163         if (directory != null && !"".equals(directory)) {164             sftp.cd(directory);165         }166         File file = new File(saveFile);167         sftp.get(downloadFile, new FileOutputStream(file));168     }169 170     /**171      * 下载文件172      * @param directory 下载目录173      * @param downloadFile 下载的文件名174      * @return 字节数组175      */176     public byte[] download(String directory, String downloadFile) throws SftpException, IOException{177         if (directory != null && !"".equals(directory)) {178             sftp.cd(directory);179         }180         InputStream is = sftp.get(downloadFile);181 182         byte[] fileData = IOUtils.toByteArray(is);183 184         return fileData;185     }186 187 188     /**189      * 删除文件190      * @param directory 要删除文件所在目录191      * @param deleteFile 要删除的文件192      */193     public void delete(String directory, String deleteFile) throws SftpException{194         sftp.cd(directory);195         sftp.rm(deleteFile);196     }197 198 199     /**200      * 列出目录下的文件201      * @param directory 要列出的目录202      */203     public Vector<?> listFiles(String directory) throws SftpException {204         return sftp.ls(directory);205     }206 207     //上传文件测试208     public static void main(String[] args) throws SftpException, IOException {209         SFTPUtil sftp = new SFTPUtil("用户名", "密码", "ip地址", 22);210         sftp.login();211         File file = new File("D:\\图片\\t0124dd095ceb042322.jpg");212         InputStream is = new FileInputStream(file);213 214         sftp.upload("基础路径","文件路径", "test_sftp.jpg", is);215         sftp.logout();216     }217 218     /***219      * 获取ftp内容220      * @param resultFileURL221      * @return222      */223     public String getFtpContent(String resultFileURL) {224         String str=null;225         log.info("SFTP getFtpContent Start");226         try {227             Map<String, String> map = URLUtil.parseSftp(resultFileURL);228             String ipAdress = map.get("ipAddress");229             int ipPort = SafeUtils.getInt(map.get("ipPort"),21);230             String userName = map.get("userName");231             String passWord = map.get("passWord");232             log.info("sftp ipAdress=" ipAdress ",ipPort=" ipPort ",userName=" userName ",passWord=" passWord);233             login();234             String path = map.get("path");235             path=path.replace("//","/"); //防止双杠导致目录失败236             log.info("ftp path=" path);237 238             /*String changePath = path.substring(0, path.lastIndexOf("/") 1);239             log.info("ftp changePath=" changePath);*/240 241             InputStream inputStream = sftp.get(path);242 243             BufferedReader br = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));244             String data = null;245             StringBuffer resultBuffer = new StringBuffer();246             while ((data = br.readLine()) != null) {247                 resultBuffer.append(data   "\n");248             }249             str = resultBuffer.toString();250             log.info("ftp content:" str);251             logout();252         } catch (Exception e) {253             // TODO Auto-generated catch block254             e.printStackTrace();255             log.error("ftp error:",e);256         }257         return str;258     }259 }

2. 调用URLUtil.java 来帮助解析Url地址

 1 public  URLUtil class{ 2     /*** 3      * 用解析sftp 4      * @param url 5      * @return 6      * @throws Exception 7      */ 8     public static Map<String, String> parseSftp(String url) throws Exception{ 9         Map<String, String> temp = new HashMap<String, String>();10         String ipPort= "21";11         //由于 URL类解析 sftp地址会报错, 所以截取掉前面的s12         url = url.substring(1);13         URL urltemp = new URL(url);14         String ipAddress = urltemp.getHost();15         if (urltemp.getPort()!=-1) {16             ipPort = urltemp.getPort() "";17         };18         String path = urltemp.getPath();19         String userInfo = urltemp.getUserInfo();20         String userName = "";21         String userPwd = "";22         if(StringUtils.isNotEmpty(userInfo)){23             String[] array = userInfo.split(":");24             if(array.length>0){25                 userName = array[0];26             }27 28             if(array.length>=1){29                 userPwd = array[1];30             }31         }32         temp.put("userName", userName);33         temp.put("passWord", userPwd);34         temp.put("ipAddress", ipAddress);35         temp.put("ipPort", ipPort);36         temp.put("path", path);37 38         return temp;39     }40 }

 

3 代码中调用方法

1 SFTPUtil sftpUtil = new SFTPUtil(resultFileURL,"");        //初始化工具类, 第二个参数为密钥,没有就不填2 cont = sftpUtil.getFtpContent(resultFileURL);            //返回读取的string 字符串, 根据双方约定解析成不同格式即可

 

来源:https://www.icode9.com/content-1-663251.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
详解sftp实现对远程服务器的文件操作
Java实现把图片上传到图片服务器(nginx+vsftp)
开发FTP服务接口,对外提供接口服务
Java SFTP 上传、下载等操作
通用上传下载组件commons-fileupload(基于SpringMVC框架)
C#winform 实现从服务器下载
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服