Java工具类(22)—服务器传文件工具类SCp和Sftp
1、Scp
package com.awifi.capacity.docker.manager.utils;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
@Slf4j
public class ScpClient {
private static ScpClient instance;
private String ip;
private int port;
private String name;
private String password;
public ScpClient(){
}
private ScpClient(String ip, int port, String name, String password){
this.ip = ip ;
this.port = port;
this.name = name;
this.password = password;
}
public void upload(String ip,int port, String userName, String pwd,String localUrl, String dataServerDestDir) {
Connection con = new Connection(ip,port);
try {
log.info("开始连接服务器");
con.connect();
boolean isAuthed = con.authenticateWithPassword(userName, pwd);
if (!isAuthed) {
log.info("连接服务器失败!");
throw new IOException("Authentication failed.文件scp到数据服务器时发生异常");
}
SCPClient client = new SCPClient(con);
log.info("连接服务器成功!");
client.put(localUrl, dataServerDestDir);
con.close();
log.info("scp上传文件结束");
} catch (Exception e) {
e.printStackTrace();
log.error("文件scp到数据服务器时发生异常" + e);
}
log.info("scp文件结束");
}
public static ScpClient getInstance(){
if(null == instance){
synchronized (ScpClient.class){
if(null == instance){
instance = new ScpClient();
}
}
}
return instance;
}
public static ScpClient getInstance(String ip, int port, String name, String password){
if(null == instance){
synchronized (ScpClient.class){
if(null == instance){
instance = new ScpClient(ip,port,name,password);
}
}
}
return instance;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2、Sftp
package com.awifi.capacity.repository.provider.Util;
import com.jcraft.jsch.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.Vector;
@Slf4j
public class SftpUtil {
private static Integer lock =11;
private static SftpUtil sftpUtil;
public static SftpUtil getInstance(String username, String password, String host, int port){
log.info("尝试连接服务器 {} {} {} {}",host,port,username,password);
if(sftpUtil ==null) {
synchronized (SftpUtil.class) {
if(sftpUtil==null) {
sftpUtil = new SftpUtil(username, password, host, port);
sftpUtil.login();
}
}
}
if(!sftpUtil.session.isConnected()){
log.error("sftp 的会话已经断开了 !!!!!!!!!!!!!!!!!!");
sftpUtil.login();
}
return sftpUtil;
}
private Logger logger = LoggerFactory.getLogger(SftpUtil.class);
private ChannelSftp sftp;
private Session session;
private String username;
private String password;
private String privateKey;
private String host;
private int port;
public SftpUtil(String username, String password, String host, int port){
this.username = username;
this.password = password;
this.host = host;
this.port = port;
}
public SftpUtil(String username, String privateKey, int port, String host){
this.username = username;
this.privateKey = privateKey;
this.host = host;
this.port = port;
}
public void login(){
log.info("开始尝试登录sftp");
JSch jsch = new JSch();
try{
if(privateKey != null){
jsch.addIdentity(privateKey);
}
session = jsch.getSession(username,host,port);
if(password != null){
session.setPassword(password);
}
session.setConfig("PreferredAuthentications","password");
session.setConfig("StrictHostKeyChecking","no");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
logger.info("sftp server connect success !!");
}catch (JSchException e){
logger.error("SFTP服务器连接异常!!", e);
}
}
public void logout(){
if(sftp != null){
if(sftp.isConnected()){
sftp.disconnect();
logger.info("sftp is close already");
}
}
if(session != null){
if(session.isConnected()){
session.disconnect();
logger.info("session is close already");
}
}
}
public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{
long start = System.currentTimeMillis();
try{
if(sftp.ls(directory) == null){
sftp.mkdir(directory);
}
sftp.cd(directory);
}catch (SftpException e){
sftp.mkdir(directory);
sftp.cd(directory);
}
sftp.put(input, sftpFileName);
logger.info("上传{} 文件到 {} 上传成功!! 耗时:{}ms",sftpFileName,directory,(System.currentTimeMillis() - start));
}
public void upload(String directory, String uploadFileUrl){
File file = new File(uploadFileUrl);
try{
upload(directory, file.getName(), new FileInputStream(file));
}catch (FileNotFoundException | SftpException e){
logger.error("上传文件异常!", e);
}
}
public void upload(String directory, String sftpFileName, byte[] bytes){
try{
upload(directory, sftpFileName, new ByteArrayInputStream(bytes));
}catch (SftpException e){
logger.error("上传文件异常!", e);
}
}
public void upload(String directory, String sftpFileName, String dataStr, String charsetName){
try{
upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));
}catch (UnsupportedEncodingException | SftpException e){
logger.error("上传文件异常!", e);
}
}
public void download(String directory, String downloadFile, String saveFile){
try{
if(directory != null && !"".equals(directory)){
sftp.cd(directory);
}
File file = new File(saveFile);
sftp.get(downloadFile, new FileOutputStream(file));
}catch (SftpException | FileNotFoundException e){
logger.error("文件下载异常!", e);
}
}
public byte[] download(String directory, String downloadFile){
try{
if(directory != null && !"".equals(directory)){
sftp.cd(directory);
}
InputStream inputStream = sftp.get(downloadFile);
return IOUtils.toByteArray(inputStream);
}catch (SftpException | IOException e){
logger.error("文件下载异常!", e);
}
return null;
}
public InputStream downloadStream(String directory, String downloadFile){
try{
if(directory != null && !"".equals(directory)){
sftp.cd(directory);
}
return sftp.get(downloadFile);
}catch (SftpException e){
logger.error("文件下载异常!", e);
}
return null;
}
public void delete(String directory, String deleteFileName){
try{
sftp.cd(directory);
sftp.rm(deleteFileName);
}catch (SftpException e){
logger.error("文件删除异常!", e);
}
}
public void delete(String directory){
Vector vector = listFiles(directory);
vector.remove(0);
vector.remove(0);
for(Object v : vector){
ChannelSftp.LsEntry lsEntry = (ChannelSftp.LsEntry)v;
try{
sftp.cd(directory);
sftp.rm(lsEntry.getFilename());
}catch (SftpException e){
logger.error("文件删除异常!", e);
}
}
}
public Vector<?> listFiles(String directory){
try{
if(isDirExist(directory)){
Vector<?> vector = sftp.ls(directory);
vector.remove(0);
vector.remove(0);
return vector;
}
}catch (SftpException e){
logger.error("获取文件夹信息异常!", e);
}
return null;
}
public boolean booleanUrl(String directory){
try{
if(sftp.ls(directory) == null){
return false;
}
}catch (Exception e){
logger.error("检测文件夹异常!", e);
}
return true;
}
public boolean createDir(String createpath) {
try {
if (isDirExist(createpath)) {
this.sftp.cd(createpath);
return true;
}
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) {
logger.error("目录创建异常!", e);
return false;
}
return true;
}
public boolean isDirExist(String directory) {
boolean isDirExistFlag = false;
try {
SftpATTRS sftpATTRS = this.sftp.lstat(directory);
isDirExistFlag = true;
return sftpATTRS.isDir();
} catch (Exception e) {
if (e.getMessage().toLowerCase().equals("no such file")) {
isDirExistFlag = false;
}
}
return isDirExistFlag;
}
public boolean isExist(String path,ChannelSftp sftp){
boolean isExist=false;
try {
sftp.lstat(path);
isExist = true;
} catch (Exception e) {
if (e.getMessage().toLowerCase().equals("no such file")) {
isExist = false;
}
}
return isExist;
}
public static void main(String[] args) {
SftpUtil sftpUtil =new SftpUtil("root","mNRbc6v9","192.168.211.119",22);
sftpUtil.login();
sftpUtil.createDir("/root/trunk/remote10/a/b/c/c/d");
}
}