fix:smb空指针问题修复

pull/2/head
dearlin 2023-11-08 17:15:45 +08:00
parent 8fc5375db9
commit 1197111074
1 changed files with 211 additions and 191 deletions

View File

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