import com.ai.frame.config.FtpConfig;
import com.ai.frame.config.SftpConfig;
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 org.apache.commons.lang3.StringUtils;
import org.omg.CORBA.SystemException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class SFTPUtils {
private ChannelSftp sftp;
private Session session;
private String sftpPath;
private Logger log = LoggerFactory.getLogger(SFTPUtils.class);
public SFTPUtils(FtpConfig ftpConfig) {
this.connectServer(ftpConfig.getFTP_ADDRESS(), Integer.parseInt(ftpConfig.getFTP_PORT()), ftpConfig.getFTP_USERNAME(), ftpConfig.getFTP_PASSWORD(), ftpConfig.getFTP_BASEPATH());
}
public SFTPUtils(SftpConfig sftpConfig) {
this.connectServer(sftpConfig.getFtpHost(), Integer.parseInt(sftpConfig.getFtpPort()), sftpConfig.getFtpUserName(), sftpConfig.getFtpPassword(), sftpConfig.getSftpPath());
}
public SFTPUtils(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword, String sftpPath) {
this.connectServer(ftpHost, ftpPort, ftpUserName, ftpPassword, sftpPath);
}
/**
* 创建连接
* @param ftpHost
* @param ftpPort
* @param ftpUserName
* @param ftpPassword
* @param sftpPath
*/
private void connectServer(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword, String sftpPath) {
try {
this.sftpPath = sftpPath;
// 创建JSch对象
JSch jsch = new JSch();
// 根据用户名,主机ip,端口获取一个Session对象
session = jsch.getSession(ftpUserName, ftpHost, ftpPort);
if (StringUtils.isNotBlank(ftpPassword)) {
// 设置密码
session.setPassword(ftpPassword);
}
Properties configTemp = new Properties();
configTemp.put("StrictHostKeyChecking", "no");
// 为Session对象设置properties
session.setConfig(configTemp);
// 设置timeout时间
session.setTimeout(60000);
// 通过Session建立链接
session.connect();
// 打开SFTP通道
sftp = (ChannelSftp) session.openChannel("sftp");
// 建立SFTP通道的连接
sftp.connect();
} catch (JSchException e) {
e.printStackTrace();
}
}
/**
* 断开SFTP Channel、Session连接
*/
public void closeChannel() {
try {
if (sftp != null) {
sftp.disconnect();
}
if (session != null) {
session.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 本地上传文件
*
* @param localFile 本地文件
* @param remotePath 远程文件
* @param fileName 文件名称
*/
public void upload(String localFile, String remotePath, String fileName) {
try {
remotePath = sftpPath + remotePath;
createDir(remotePath);
sftp.put(localFile, (remotePath + fileName), ChannelSftp.OVERWRITE);
} catch (SftpException e) {
e.printStackTrace();
}
}
/**
* 文件流上传文件
*
* @param file 文件流
* @param remotePath 远程目录
* @param fileName 文件名称
*/
public void upload(MultipartFile file, String remotePath, String fileName) {
InputStream is = null;
try {
remotePath = sftpPath + remotePath;
createDir(remotePath);
is = file.getInputStream();
sftp.put(is, fileName);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
log.error(e.toString());
}
}
}
}
/**
* 下载文件
*
* @param remotePath 远程文件
* @param fileName 文件名称
* @param localFile 本地文件
*/
public void download(String remotePath, String fileName, String localFile) {
try {
remotePath = sftpPath + remotePath;
if (StringUtils.isNotBlank(remotePath)) {
sftp.cd(remotePath);
}
sftp.get((remotePath + fileName), localFile);
} catch (SftpException e) {
e.printStackTrace();
}
}
/**
* 下载文件
*
* @param remotePath 远程路径
*/
public InputStream download(String remotePath, String fileName) {
try {
remotePath = sftpPath + remotePath;
if (StringUtils.isNotBlank(remotePath)) {
sftp.cd(remotePath);
}
return sftp.get(fileName);
} catch (SftpException e) {
e.printStackTrace();
}
return null;
}
/**
* 删除文件
*
* @param remotePath 要删除文件所在目录
*/
public void delete(String remotePath) {
try {
if (StringUtils.isNotBlank(remotePath)) {
remotePath = sftpPath + remotePath;
sftp.rm(remotePath);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 创建一个文件目录
*/
public void createDir(String createpath) {
try {
if (isDirExist(createpath)) {
this.sftp.cd(createpath);
return;
}
String pathArry[] = createpath.split("/");
StringBuffer filePath = new StringBuffer("/");
for (String path : pathArry) {
if (path.equals("")) {
continue;
}
filePath.append(path + "/");
if (isDirExist(filePath.toString())) {
sftp.cd(filePath.toString());
} else {
// 建立目录
sftp.mkdir(filePath.toString());
// 进入并设置为当前目录
sftp.cd(filePath.toString());
}
}
this.sftp.cd(createpath);
} catch (SftpException e) {
e.printStackTrace();
}
}
/**
* 判断目录是否存在
*/
public boolean isDirExist(String directory) {
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;
}
}