package cn.microvideo.etc.util;
import com.jcraft.jsch.*;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.util.*;
/**
* title: SftpUtils
* projectName etc-server
* description: TODO
* date 2019/8/9 18:16
*
* @author yanyd
* @since 1.0
*/
@SuppressWarnings("Duplicates")
@Slf4j
public class SftpUtils {
public static final String PROJECT = System.getProperty("user.dir");
private ChannelSftp sftp;
private Session session;
/**
* 连接sftp服务器
*/
public void login(String sftp_txb_username,String sftp_txb_host,String sftp_txb_port,String sftp_txb_password){
try {
JSch jsch = new JSch();
session = jsch.getSession(sftp_txb_username, sftp_txb_host, Integer.parseInt(sftp_txb_port));
session.setPassword(sftp_txb_password);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
log.info("============sftp连接成功============");
} catch (JSchException e) {
e.printStackTrace();
StringTools.printerrlog(e);
log.info("============sftp连接失败============");
}
}
/**
* 关闭连接 server
*/
public void logout(){
if (sftp != null) {
if (sftp.isConnected()) {
sftp.disconnect();
}
}
if (session != null) {
if (session.isConnected()) {
session.disconnect();
}
}
}
/**
* 将本地文件上传到sftp指定目录
* 将输入流的数据上传到sftp作为文件
* @param sftpFileName sftp端文件名
* @param sftp_up_path sftp目录
*/
public boolean upload( String sftpFileName,String sftp_up_path,InputStream inputStream){
boolean flag=false;
try{
if(isDirExist(sftp_up_path)){
sftp.cd(sftp_up_path);
}else{
//目录不存在,则创建文件夹
String [] dirs=sftp_up_path.split("/");
String tempPath="";
for(String dir:dirs){
if(null== dir || "".equals(dir)) {
continue;
}
tempPath+="/"+dir;
if(isDirExist(tempPath)){
sftp.cd(tempPath);
}else{
sftp.mkdir(tempPath);
sftp.cd(tempPath);
}
}
}
sftp.put(inputStream, sftpFileName); //上传文件
inputStream.close();
flag=true;
log.info("sftp文件上传成功:【{}】",sftpFileName);
}catch (Exception e){
e.printStackTrace();
StringTools.printerrlog(e);
flag=false;
log.info("sftp文件上传失败:【{}】",sftpFileName);
}
return flag;
}
/**
* 将指定目录下的sftp文件 下载到本地
* @param downloadFile 下载的文件
* @param sftp_down_path sftp目录
* @param saveFile 存在本地的路径
*/
public boolean download( String downloadFile, String sftp_down_path,String saveFile){
boolean flag=false;
try{
if(isDirExist(sftp_down_path)){
sftp.cd(sftp_down_path);
File file = new File(saveFile);
FileOutputStream fileOutputStream=new FileOutputStream(file);
sftp.get(downloadFile, fileOutputStream);
fileOutputStream.close();
flag=true;
log.info("sftp文件下载成功:【{}】",downloadFile);
}
}catch (Exception e){
e.printStackTrace();
StringTools.printerrlog(e);
flag=false;
log.info("sftp文件下载失败:【{}】",downloadFile);
}
return flag;
}
/**
* 验证文件夹
* @param remotePath
* @return
*/
public boolean isDirExist(String remotePath) {
boolean flag = false;
try {
SftpATTRS sftpATTRS = sftp.lstat(remotePath);
flag= sftpATTRS.isDir();
} catch (Exception e) {
e.printStackTrace();
StringTools.printerrlog(e);
flag = false;
}
return flag;
}
/**
* 删除文件
* @param directory 要删除文件所在目录
* @param deleteFile 要删除的文件
*/
public void delete(String directory, String deleteFile){
try{
sftp.cd(directory);
sftp.rm(deleteFile);
}catch (Exception e){
e.printStackTrace();
StringTools.printerrlog(e);
}
}
/**
*
* 列出目录下的文件
* @param directory 要列出的目录
*/
public List<String> listFiles(String directory){
List<String> list=new ArrayList<>();
Vector<ChannelSftp.LsEntry> vector=new Vector<>();
try{
vector= sftp.ls(directory);
for (ChannelSftp.LsEntry file : vector){
String fileName = file.getFilename();
list.add(fileName);
}
}catch (Exception e){
e.printStackTrace();
StringTools.printerrlog(e);
}
return list;
}
//上传文件测试
public static void main(String[] args) throws Exception {
}
}
pom.xml
<!--sftp-->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
网友评论