package com.sk.sbm.edge.utils;
import com.jcraft.jsch.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils;
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import java.util.Vector;
/**
@Author :zsx
@Date:2020/7/9
@Description: sftp上传下载工具类 */ @Slf4j @Component public class SFTPUtil { @Value(" s f t p . h o s t " ) p r i v a t e S t r i n g h o s t ; @ V a l u e ( " {sftp.host}") private String host; @Value(" sftp.host")privateStringhost;@Value("{sftp.user-name}") private String username; @Value(" s f t p . p a s s w o r d " ) p r i v a t e S t r i n g p a s s w o r d ; @ V a l u e ( " {sftp.password}") private String password; @Value(" sftp.password")privateStringpassword;@Value("{sftp.port}") private int port = 22; private ChannelSftp sftp = null; private Session sshSession = null;
public SFTPUtil(){
}
/**
@Author: zsx@Description: sftp连接@DateTime: 2020/7/9@Params:@Return */ public void connect(){ try{ JSch jsch = new JSch(); jsch.getSession(username,host,port); sshSession = jsch.getSession(username,host,port); sshSession.setPassword(password); Properties sshConfig = new Properties(); sshConfig.put(“StrictHostKeyChecking”,“no”); sshSession.setConfig(sshConfig); sshSession.connect(); log.info(" sftp Session created."); Channel channel = sshSession.openChannel(“sftp”); channel.connect(); log.info(“Opening Channel.”); sftp = (ChannelSftp)channel; log.info(“Connected to {}”,host); }catch(Exception e){ log.error(“连接sftp服务器发生异常”,e); } }/**
@Author: zsx@Description: 关闭连接@DateTime: 2020/7/9@Params:@Return */ public void disconnect(){ if(sftp != null){ if(sftp.isConnected()){ sftp.disconnect(); log.info(“sftp is closed already”); } } if(sshSession != null){ if(sshSession.isConnected()){ sshSession.disconnect(); log.info(“sshSession is closed already”); } } }/**
下载单个文件
@param remotePath:远程下载目录(以路径符号结束)
@param remoteFileName:下载文件名
@param localPath:本地保存目录(以路径符号结束)
@param localFileName:保存文件名
@return */ public boolean downloadFile(String remotePath,String remoteFileName,String localPath, String localFileName){
String filePath = remotePath + remoteFileName; File file = new File(localPath + localFileName); try( FileOutputStream fieloutput = new FileOutputStream(file)){ sftpIsNull();
sftp.get(filePath,fieloutput); log.info("---下载文件:【{}】成功,保存路径为:【{}】",filePath,localPath); return true;}catch(Exception e){ //将本地流生成的临时文件删除掉 file.delete(); log.error(“下载文件发生异常,远端文件路径为【”+filePath+"】",e); } return false; }
/**
上传单个文件@param remotePath:上传的路径@param remoteFileName:保存的文件名@param in:流@return@throws / public boolean uploadFile(String remotePath, String remoteFileName, InputStream in ) { try{ sftpIsNull(); if (this.sameFileExisted(remotePath,remoteFileName)){ log.warn(“目录【{}】中已经存在文件【{}】上传失败”,remotePath,remoteFileName); return false; } String filePath = remotePath + remoteFileName; sftp.put(in,filePath); log.info(“文件【{}】上传成功”,filePath); return true; }catch(Exception e){ log.error(“上传文件发生异常”,e); } finally{ if(in != null){ try{ in.close(); }catch(IOException e){ log.error(“流关闭异常”,e); } } } return false; } /*列出目录下的文件@param directory:要列出的目录@param@return@throws SftpException */ public Vector<ChannelSftp.LsEntry> listFiles(String directory) { try { sftpIsNull(); if(!StringUtils.isEmpty(directory)){ return sftp.ls(directory); } } catch (SftpException e) { log.error(“无法列出目录【”+directory+"】下的文件",e); } return null; }/**
@Author: zsx@Description: 判断下是否有相同文件@DateTime: 2020/7/9@Params:@Return */ public boolean sameFileExisted(String dicrectory,String fileName){ Vector<ChannelSftp.LsEntry> vector = this.listFiles(dicrectory); for (ChannelSftp.LsEntry entry : vector) { if(entry.getFilename().equals(fileName)){ return true; } } return false; }/**
删除stfp文件@param directory:要删除文件所在目录@param deleteFile:要删除的文件@param */ public void deleteSFTP(String directory,String deleteFile){ try{ sftpIsNull(); sftp.rm(directory + deleteFile); log.info(“delete file success from sftp.”); }catch(Exception e){ log.error(“sftp删除文件发生异常”,e); } }private void sftpIsNull(){ if(sftp == null){ throw new RuntimeException(“sftp实例为null”); } }
} 应用: @Autowired private SFTPUtil sftpUtil; public Result uploadFile(MultipartFile file) { //获取文件名称 String fileName = file.getName(); Result result = new Result(); if (StringUtils.isEmpty(fileName)) { result.setStatus(Result.FILE_MISS_STATUS); result.setMsg(“文件名不存在”); } else {
//拼接文件目录 String fileDir = combineFileDir(fileName); result.setFileName(fileDir+fileName); log.info("文件上传的完整目录为【{}】",fileDir); try (InputStream in = file.getInputStream()) { //上传文件 sftpUtil.connect(); boolean upLoadResult = sftpUtil.uploadFile(fileDir,fileName,in); if (upLoadResult) { //上传成功 result.setStatus(Result.SUCCESS_STATUS); result.setMsg("文件上传成功"); result.setFileLength(file.getSize()); } else { result.setStatus(Result.FAILURE_STATUS); result.setMsg("文件上传失败"); } } catch (IOException e) { log.error("文件上传IO错误", e); result.setStatus(Result.FAILURE_STATUS); result.setMsg("文件上传IO错误!"); }finally { sftpUtil.disconnect(); } } return result; } @Override public Result downloadFile(String fileName, String localPath) { sftpUtil.connect(); Result result = new Result(); if (StringUtils.isEmpty(fileName)) { result.setStatus(Result.FILE_MISS_STATUS); result.setMsg("文件名不存在"); } else { try { String fileDir = this.combineFileDir(fileName); log.info("文件下载的完整路径为【{}】",fileDir); result.setFileName(fileDir+fileName); boolean downLoadResult = sftpUtil.downloadFile(fileDir,fileName,localPath,fileName); if (downLoadResult){ result.setStatus(Result.SUCCESS_STATUS); result.setMsg("下载成功"); }else{ result.setStatus(Result.FAILURE_STATUS); result.setMsg("下载失败"); } } catch (Exception e) { log.error("文件下载失败", e); result.setStatus(Result.FAILURE_STATUS); result.setMsg("下载失败"); } finally { sftpUtil.disconnect(); } } return result; }