package com.zcloud.util; import java.io.InputStream; import java.io.OutputStream; import java.util.Vector; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Configurable; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.web.multipart.MultipartFile; 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; import com.jcraft.jsch.SftpATTRS; import com.jcraft.jsch.SftpException; import javax.annotation.Resource; @Configuration public class Smb { public static String host; public static Integer port; public static String user; public static String password; public static String basePath; @Resource private RocketMQTemplate rocketMQTemplate; @Value("${smb.host}") public void setHostPath(String hostProperties) { host = hostProperties; } @Value("${smb.port}") public void setPortPath(Integer portProperties) { port = portProperties; } @Value("${smb.user}") public void setUserPath(String userProperties) { user = userProperties; } @Value("${smb.password}") public void setPasswordPath(String passwordProperties) { password = passwordProperties; } @Value("${smb.basePath}") public void setBasePath(String basePathProperties) { basePath = basePathProperties; } // private static String host = "39.103.224.166"; // // private static Integer port = 22; // // private static String user = "root"; // // private static String password = "Zcloud@zcloud88888"; // // private static String basePath = "/mnt/qgfile/file/"; // private static String host = "192.168.192.201"; // // private static Integer port = Integer.valueOf(22); // // private static String user = "root"; // // private static String password = "SJSKAQHBGLXT@20220311"; // // private static String basePath = "/mnt/qask/file/"; public static final String SMBBAES_PATH = basePath; public static void sshSftp(MultipartFile file, String fileName, String path) throws Exception { Session session = null; Channel channel = null; JSch jsch = new JSch(); if (port <= 0) { // 连接服务器,采用默认端口 session = jsch.getSession(user, host); } else { // 采用指定的端口连接服务器 session = jsch.getSession(user, host, port); } // 如果服务器连接不上,则抛出异常 if (session == null) { throw new Exception("session is null"); } // 设置登陆主机的密码 session.setPassword(password); // 设置第一次登陆的时候提示,可选值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); // 设置登陆超时时间 session.connect(30000); OutputStream outstream = null; try { // 创建sftp通信通道 channel = (Channel) session.openChannel("sftp"); channel.connect(1000); ChannelSftp sftp = (ChannelSftp) channel; // 进入服务器指定的文件夹 // File dir = new File(basePath+"/"+path); // dir.setWritable(true, false); // if(!dir.exists()){ // dir.mkdirs(); // } createDir(basePath + path, sftp); sftp.cd(basePath + path); // 列出服务器指定的文件列表 // Vector v = sftp.ls("*"); // for(int i=0;i<v.size();i++){ // System.out.println(v.get(i)); // } // 以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了 sftp.put(file.getInputStream(), fileName); } catch (Exception e) { e.printStackTrace(); } finally { // 关流操作 if (outstream != null) { outstream.flush(); outstream.close(); } if (session != null) { session.disconnect(); } if (channel != null) { channel.disconnect(); } } } /* * bus_imgfiles表 * IMGFILES_ID,FOREIGN_KEY,TYPE * 这三个值必须要传,所以用到Smb.sshSftp * */ public static void sshSftp(MultipartFile file, String fileName, String path,String IMGFILES_ID,String FOREIGN_KEY,String TYPE) throws Exception { Session session = null; Channel channel = null; JSch jsch = new JSch(); if (port <= 0) { // 连接服务器,采用默认端口 session = jsch.getSession(user, host); } else { // 采用指定的端口连接服务器 session = jsch.getSession(user, host, port); } // 如果服务器连接不上,则抛出异常 if (session == null) { throw new Exception("session is null"); } // 设置登陆主机的密码 session.setPassword(password); // 设置第一次登陆的时候提示,可选值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); // 设置登陆超时时间 session.connect(30000); OutputStream outstream = null; try { // 创建sftp通信通道 channel = (Channel) session.openChannel("sftp"); channel.connect(1000); ChannelSftp sftp = (ChannelSftp) channel; // 进入服务器指定的文件夹 // File dir = new File(basePath+"/"+path); // dir.setWritable(true, false); // if(!dir.exists()){ // dir.mkdirs(); // } createDir(basePath + path, sftp); sftp.cd(basePath + path); // 列出服务器指定的文件列表 // Vector v = sftp.ls("*"); // for(int i=0;i<v.size();i++){ // System.out.println(v.get(i)); // } // 以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了 sftp.put(file.getInputStream(), fileName); } catch (Exception e) { e.printStackTrace(); } finally { // 关流操作 if (outstream != null) { outstream.flush(); outstream.close(); } if (session != null) { session.disconnect(); } if (channel != null) { channel.disconnect(); } } } /* * bus_imgfiles表 * IMGFILES_ID,FOREIGN_KEY,TYPE * 这三个值必须要传,所以用到Smb.sshSftp * */ public static void sshSftpForInput(InputStream fileI, String fileName, String path,String IMGFILES_ID,String FOREIGN_KEY,String TYPE) throws Exception { Session session = null; Channel channel = null; JSch jsch = new JSch(); if (port <= 0) { // 连接服务器,采用默认端口 session = jsch.getSession(user, host); } else { // 采用指定的端口连接服务器 session = jsch.getSession(user, host, port); } // 如果服务器连接不上,则抛出异常 if (session == null) { throw new Exception("session is null"); } // 设置登陆主机的密码 session.setPassword(password); // 设置第一次登陆的时候提示,可选值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); // 设置登陆超时时间 session.connect(30000); OutputStream outstream = null; try { // 创建sftp通信通道 channel = (Channel) session.openChannel("sftp"); channel.connect(1000); ChannelSftp sftp = (ChannelSftp) channel; // 进入服务器指定的文件夹 // File dir = new File(basePath+"/"+path); // dir.setWritable(true, false); // if(!dir.exists()){ // dir.mkdirs(); // } createDir(basePath + path, sftp); sftp.cd(basePath + path); // 列出服务器指定的文件列表 // Vector v = sftp.ls("*"); // for(int i=0;i<v.size();i++){ // System.out.println(v.get(i)); // } // 以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了 sftp.put(fileI, fileName); } catch (Exception e) { e.printStackTrace(); } finally { // 关流操作 if (outstream != null) { outstream.flush(); outstream.close(); } if (session != null) { session.disconnect(); } if (channel != null) { channel.disconnect(); } } } public static void sshSftpForInput(InputStream fileI, String fileName, String path) throws Exception { Session session = null; Channel channel = null; JSch jsch = new JSch(); if (port <= 0) { // 连接服务器,采用默认端口 session = jsch.getSession(user, host); } else { // 采用指定的端口连接服务器 session = jsch.getSession(user, host, port); } // 如果服务器连接不上,则抛出异常 if (session == null) { throw new Exception("session is null"); } // 设置登陆主机的密码 session.setPassword(password); // 设置第一次登陆的时候提示,可选值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); // 设置登陆超时时间 session.connect(30000); OutputStream outstream = null; try { // 创建sftp通信通道 channel = (Channel) session.openChannel("sftp"); channel.connect(1000); ChannelSftp sftp = (ChannelSftp) channel; // 进入服务器指定的文件夹 // File dir = new File(basePath+"/"+path); // dir.setWritable(true, false); // if(!dir.exists()){ // dir.mkdirs(); // } createDir(basePath + path, sftp); sftp.cd(basePath + path); // 列出服务器指定的文件列表 // Vector v = sftp.ls("*"); // for(int i=0;i<v.size();i++){ // System.out.println(v.get(i)); // } // 以下代码实现从本地上传一个文件到服务器,如果要实现下载,对换以下流就可以了 sftp.put(fileI, fileName); } catch (Exception e) { e.printStackTrace(); } finally { // 关流操作 if (outstream != null) { outstream.flush(); outstream.close(); } if (session != null) { session.disconnect(); } if (channel != null) { channel.disconnect(); } } } public static void createDir(String createpath, ChannelSftp sftp) { try { if (isDirExist(createpath, sftp)) { sftp.cd(createpath); } String pathArry[] = createpath.split("/"); StringBuffer filePath = new StringBuffer("/"); for (String path : pathArry) { if (path.equals("")) { continue; } filePath.append(path + "/"); if (isDirExist(filePath.toString(), sftp)) { sftp.cd(filePath.toString()); } else { // 建立目录 sftp.mkdir(filePath.toString()); // 进入并设置为当前目录 sftp.cd(filePath.toString()); } } sftp.cd(createpath); } catch (SftpException e) { // throw new SystemException("创建路径错误:" + createpath); } } public static boolean isDirExist(String directory, ChannelSftp sftp) { boolean isDirExistFlag = false; try { SftpATTRS sftpATTRS = sftp.lstat(directory); isDirExistFlag = true; return sftpATTRS.isDir(); } catch (Exception e) { if (e.getMessage().toLowerCase().equals("no such file")) { isDirExistFlag = false; } } return isDirExistFlag; } /** * 删除文件 * Rhidd * * @throws SftpException * @throws JSchException */ public static void deleteFile(String directoryFile) throws Exception { Session session = null; JSch jsch = new JSch(); if (port <= 0) { // 连接服务器,采用默认端口 session = jsch.getSession(user, host); } else { // 采用指定的端口连接服务器 session = jsch.getSession(user, host, port); } // 如果服务器连接不上,则抛出异常 if (session == null) { throw new Exception("session is null"); } // 设置登陆主机的密码 session.setPassword(password); // 设置第一次登陆的时候提示,可选值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); // 设置登陆超时时间 session.connect(30000); // 打开openChannel的sftp ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp"); // 远程连接 channelSftp.connect(); // 删除文件 try { Vector<ChannelSftp.LsEntry> vector = channelSftp.ls(basePath + directoryFile); if (vector.size() == 1) { // 文件,直接删除 channelSftp.rm(basePath + directoryFile); System.out.println("4、" + directoryFile + " 删除的文件....."); } } catch (Exception e) { throw new RuntimeException(e); } // 切断远程连接 channelSftp.exit(); } }