package com.java110.core.client;
|
|
import com.java110.utils.util.Base64Convert;
|
import com.java110.utils.util.DateUtil;
|
import com.jcraft.jsch.*;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.stereotype.Component;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayOutputStream;
|
import java.io.IOException;
|
import java.io.InputStream;
|
import java.util.Properties;
|
import java.util.UUID;
|
import java.util.Vector;
|
|
/**
|
* @author joychen
|
* @date 2020/4/21 4:59 PM
|
*/
|
@Component
|
public class JSchFtpUploadTemplate {
|
|
private static final Logger LOG = LoggerFactory.getLogger(JSchFtpUploadTemplate.class);
|
|
|
|
private static String ftpPath = "uploadFiles"; // 文件上传目录
|
|
private static String LOCAL_CHARSET = "GBK";
|
private static String SERVER_CHARSET = "ISO-8859-1";
|
private final static String localpath = "F:/";//下载到F盘下
|
private final static String fileSeparator = System.getProperty("file.separator");
|
|
private final static String DEFAULT_IMG_SUFFIX = ".jpg";
|
|
private final static String IMAGE_DEFAULT_PATH = "img/";
|
|
|
private Channel channel = null;
|
private Session session = null;
|
|
|
/*
|
*图片上传工具方法
|
* 默认上传至 img 文件下的当前日期下
|
*/
|
public String upload(String imageBase64, String server, int port,
|
String userName, String userPassword, String ftpPath) {
|
String fileName = "";
|
ChannelSftp sftp = null;
|
try {
|
sftp = getChannel(server,port+"",userName,userPassword,0);
|
|
ftpPath = ftpPath + IMAGE_DEFAULT_PATH + DateUtil.getNowII() + "/";
|
|
createDir(sftp, ftpPath);// 创建目录
|
|
// 设置上传目录 must
|
fileName = UUID.randomUUID().toString();
|
|
if (imageBase64.contains("data:image/png;base64,")) {
|
imageBase64 = imageBase64.replace("data:image/png;base64,", "");
|
fileName += ".png";
|
} else if (imageBase64.contains("data:image/jpeg;base64,")) {
|
imageBase64 = imageBase64.replace("data:image/jpeg;base64,", "");
|
fileName += ".jpg";
|
} else if (imageBase64.contains("data:image/webp;base64,")) {
|
imageBase64 = imageBase64.replace("data:image/webp;base64,", "");
|
fileName += ".jpg";
|
} else if(imageBase64.contains("data:application/octet-stream;base64,")){
|
imageBase64 = imageBase64.replace("data:application/octet-stream;base64,", "");
|
fileName += ".jpg";
|
}else {
|
fileName += ".jpg";
|
}
|
byte[] context = Base64Convert.base64ToByte(imageBase64);
|
ByteArrayInputStream is = new ByteArrayInputStream(context);
|
|
Vector<String> vector = sftp.ls(ftpPath);
|
if (vector.contains(fileName)){
|
System.out.println("this file exist ftp");
|
sftp.rm(fileName);
|
}else{
|
System.out.println("this file not exist ftp");
|
}
|
|
sftp.put(is,fileName);
|
is.close();
|
sftp.disconnect();
|
} catch (Exception e) {
|
LOG.error("上传文件失败", e);
|
throw new IllegalArgumentException("上传文件失败");
|
} finally {
|
try {
|
if (sftp !=null) {
|
sftp.disconnect();
|
}
|
closeChannel();
|
} catch (IOException e) {
|
e.printStackTrace();
|
LOG.error("关闭ftpClient 失败", e);
|
} catch (Exception e) {
|
e.printStackTrace();
|
e.printStackTrace();
|
LOG.error("关闭ftpClient 失败", e);
|
}
|
}
|
return IMAGE_DEFAULT_PATH + DateUtil.getNowII() + "/" + fileName;
|
}
|
|
/**
|
*
|
* @param ftpHost
|
* @param port
|
* @param ftpUserName
|
* @param ftpPassword
|
* @param timeout
|
* @return
|
* @throws JSchException
|
*/
|
public ChannelSftp getChannel(String ftpHost,
|
String port , String ftpUserName ,String ftpPassword ,int timeout) throws JSchException {
|
|
int ftpPort = 22;
|
if (port != null && !port.equals("")) {
|
ftpPort = Integer.valueOf(port);
|
}
|
|
JSch jsch = new JSch(); // 创建JSch对象
|
session = jsch.getSession(ftpUserName, ftpHost, ftpPort); // 根据用户名,主机ip,端口获取一个Session对象
|
LOG.debug("Session created.");
|
if (ftpPassword != null) {
|
session.setPassword(ftpPassword); // 设置密码
|
}
|
Properties config = new Properties();
|
config.put("StrictHostKeyChecking", "no");
|
session.setConfig(config); // 为Session对象设置properties
|
session.setTimeout(timeout); // 设置timeout时间
|
session.connect(); // 通过Session建立链接
|
LOG.debug("Session connected.");
|
|
LOG.debug("Opening Channel.");
|
channel = session.openChannel("sftp"); // 打开SFTP通道
|
channel.connect(); // 建立SFTP通道的连接
|
LOG.debug("Connected successfully to ftpHost = " + ftpHost + ",as ftpUserName = " + ftpUserName
|
+ ", returning: " + channel);
|
return (ChannelSftp) channel;
|
}
|
|
public void closeChannel() throws Exception {
|
if (channel != null) {
|
channel.disconnect();
|
}
|
if (session != null) {
|
session.disconnect();
|
}
|
}
|
|
|
|
/*
|
*文件上传工具方法
|
*/
|
public String upload(MultipartFile uploadFile, String server, int port,
|
String userName, String userPassword, String ftpPath) {
|
String fileName = "";
|
|
ChannelSftp sftp = null;
|
|
try {
|
sftp = getChannel(server,port+"",userName,userPassword,0);
|
createDir(sftp, ftpPath);// 创建目录
|
fileName = UUID.randomUUID().toString() + "." + uploadFile.getOriginalFilename().substring(uploadFile.getOriginalFilename().lastIndexOf(".") + 1);
|
InputStream os = sftp.get(fileName);
|
int length = os.read();
|
if (length == 0) {
|
System.out.println("this file not exist ftp");
|
} else if (length >= 1) {
|
System.out.println("this file exist ftp");
|
sftp.rm(fileName);
|
}
|
|
|
InputStream is = uploadFile.getInputStream();
|
sftp.put(is,fileName);
|
is.close();
|
sftp.disconnect();
|
|
} catch (Exception e) {
|
// logger.error("上传文件失败", e);
|
throw new IllegalArgumentException("上传文件失败");
|
} finally {
|
try {
|
if (sftp !=null) {
|
sftp.disconnect();
|
}
|
closeChannel();
|
} catch (IOException e) {
|
e.printStackTrace();
|
LOG.error("关闭ftpClient 失败", e);
|
} catch (Exception e) {
|
e.printStackTrace();
|
e.printStackTrace();
|
LOG.error("关闭ftpClient 失败", e);
|
}
|
}
|
return fileName;
|
}
|
|
/*
|
*文件下载工具方法
|
*/
|
public byte[] downFileByte(String remotePath, String fileName, String server, int port, String userName, String userPassword) {
|
byte[] return_arraybyte = null;
|
|
ChannelSftp sftp = null;
|
LOG.info("remotePath"+remotePath+" fileName = "+fileName);
|
try {
|
sftp = getChannel(server,port+"",userName,userPassword,0);
|
|
if (sftp != null) {
|
String f = new String(
|
(remotePath + fileName).getBytes("UTF-8"), SERVER_CHARSET);//防止乱码
|
InputStream ins = sftp.get(f);//需使用file.getName获值,若用f会乱码
|
|
|
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
|
|
sftp.get(f,byteOut);
|
// byte[] buf = new byte[204800];
|
// int bufsize = 0;
|
// int readLength = 2048;
|
// while (ins != null && (bufsize = ins.read(buf, bufsize,bufsize+readLength)) != -1) {
|
// byteOut.write(buf, bufsize, bufsize + readLength);
|
// }
|
return_arraybyte = byteOut.toByteArray();
|
byteOut.close();
|
if (ins != null) {
|
ins.close();
|
}
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
LOG.error("从ftp读取文件失败", e);
|
} finally {
|
try {
|
if (sftp !=null) {
|
sftp.disconnect();
|
}
|
closeChannel();
|
} catch (IOException e) {
|
e.printStackTrace();
|
LOG.error("关闭ftpClient 失败", e);
|
} catch (Exception e) {
|
e.printStackTrace();
|
e.printStackTrace();
|
LOG.error("关闭ftpClient 失败", e);
|
}
|
}
|
return return_arraybyte;
|
}
|
|
|
|
/**
|
* 创建一个文件目录
|
*/
|
public void createDir(ChannelSftp sftp,String createpath) {
|
try {
|
if (isDirExist(sftp,createpath)) {
|
if (sftp.pwd().equals(createpath)){
|
return;
|
}
|
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(sftp,filePath.toString())) {
|
sftp.cd(filePath.toString());
|
} else {
|
// 建立目录
|
sftp.mkdir(filePath.toString());
|
// 进入并设置为当前目录
|
sftp.cd(filePath.toString());
|
}
|
}
|
sftp.cd(createpath);
|
} catch (SftpException e) {
|
throw new IllegalArgumentException("创建路径错误:" + createpath);
|
}
|
}
|
|
/**
|
* 判断目录是否存在
|
*/
|
public boolean isDirExist(ChannelSftp sftp,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;
|
}
|
|
|
}
|