package com.osplat.util; import java.io.*; import com.jcraft.jsch.*;import com.osplat.bean.Resultmodel;import org.springframework.web.multipart.MultipartFile; /** * @Company:wftdlx * @Author: wjf * @Description: linus 文件上传 * @Date: Created in 10:33 2019/2/14 */public class FtpsFileList { //jar包/*
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.49</version></dependency>*/
//测试程序
/*@PostMapping("/uploadImage")@ResponseBodypublic Resultmodel uploadImage(@RequestParam MultipartFile file) { if (file==null) { String msg="上传文件不能为空"; Log.info(msg); return new Resultmodel(0,"上传失败"); } Resultmodel resultmodel=null; try { resultmodel = FtpsFileList.sshSftp(file); } catch (Exception e) { System.out.println("上传失败"+e.getMessage()); return new Resultmodel(0,"上传失败"); } Object fileName=resultmodel.getData(); return new Resultmodel(0,"上传成功",fileName);}*/
public static String user = "root"; public static String ip = "111.111.1.11"; public static int port = 22; public static String psw = "123456"; public static String uploadFileName = UuidUtil.get32UUID(); /** * 利用JSch包实现SFTP下载、上传文件(用户名密码方式登陆) * <p> * ip 主机IP * user 主机登陆用户名 * psw 主机登陆密码 * port 主机ssh2登陆端口,如果取默认值(默认值22),传-1 */ public static Resultmodel sshSftp(MultipartFile file) throws Exception { Log.info("开始用户名密码方式登陆"); Session session = null; JSch jsch = new JSch(); if (port <= 0) { //连接服务器,采用默认端口 session = jsch.getSession(user, ip); } else { //采用指定的端口连接服务器 session = jsch.getSession(user, ip, port); } //如果服务器连接不上,则抛出异常 if (session == null) { throw new Exception("session is null"); } //设置登陆主机的密码 session.setPassword(psw);//设置密码 session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password"); //设置第一次登陆的时候提示,可选值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); //设置登陆超时时间 session.connect(2000000); String allName = uploadFileName + file.getOriginalFilename(); sftp(session, allName, file);//allName 上传文件后重命名 Log.info("sftp成功"); return new Resultmodel(0, "文件上传成功", allName); } private static void sftp(Session session, String uploadFileName, MultipartFile file) throws Exception { Channel channel = null; try { //创建sftp通信通道 channel = (Channel) session.openChannel("sftp"); channel.connect(1000); ChannelSftp sftp = (ChannelSftp) channel; //进入服务器指定的文件夹 sftp.cd("/home/numa/image"); //列出服务器指定的文件列表 /*Vector v = sftp.ls("*.txt"); for (int i = 0; i < v.size(); i++) { System.out.println(v.get(i)); }*/ //以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了 OutputStream outstream = sftp.put(uploadFileName);//上传文件重名 //MultipartFile转File File f = null; try { f = File.createTempFile("tmp", null); file.transferTo(f); } catch (Exception e) { e.printStackTrace(); } //上传流 InputStream instream = new FileInputStream(f);//上传文件内容 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(); Log.error("文件上传util报错" + e.getMessage()); } finally { session.disconnect(); channel.disconnect(); } } /** * 利用JSch包实现SFTP下载、上传文件(秘钥方式登陆) * * @param ip 主机IP * @param user 主机登陆用户名 * @param port 主机ssh2登陆端口,如果取默认值(默认值22),传-1 * @param privateKey 密钥文件路径 * @param passphrase 密钥的密码 */ /* public static void sshSftp2(String ip, String user , int port, String privateKey, String passphrase) throws Exception { System.out.println("开始秘钥方式登陆"); Session session = null; JSch jsch = new JSch(); //设置密钥和密码 //支持密钥的方式登陆,只需在jsch.getSession之前设置一下密钥的相关信息就可以了 if (privateKey != null && !"".equals(privateKey)) { if (passphrase != null && "".equals(passphrase)) { //设置带口令的密钥 jsch.addIdentity(privateKey, passphrase); } else { //设置不带口令的密钥 jsch.addIdentity(privateKey); } } if (port <= 0) { //连接服务器,采用默认端口 session = jsch.getSession(user, ip); } else { //采用指定的端口连接服务器 session = jsch.getSession(user, ip, port); } //如果服务器连接不上,则抛出异常 if (session == null) { throw new Exception("session is null"); } //设置第一次登陆的时候提示,可选值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); //设置登陆超时时间 session.connect(30000); sftp(session, "bb.log"); System.out.println("sftp成功"); }*/}