1、ftp
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.*;
import java.util.List;
import java.util.Map;
public class FtpUtils {
private static FTPClient ftpClient;
/**
* 獲取ftpClient
* @param host 主機ip
* @param port 端口號
* @param username ftp用戶名
* @param password ftp密碼
* @return FTPClient對象
*/
private static FTPClient getFTPClient(String host,int port,String username,String password) {
ftpClient = new FTPClient();
try {
//連接ftp服務器
ftpClient.connect(host, port);
//登錄ftp
ftpClient.login(username, password);
} catch (IOException e) {
LogUtil.error("連接ftp服務器異常!",e);
return ftpClient;
}
//設置編碼方式
ftpClient.setControlEncoding("UTF-8");
try {
//設置文件類型,二進制文件
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
} catch (IOException e) {
LogUtil.error("設置文件類型異常!",e);
return ftpClient;
}
//設置被動模式(默認方式)
ftpClient.enterLocalPassiveMode();
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
//連接失敗
try {
ftpClient.disconnect();
} catch (IOException e) {
LogUtil.error("關閉ftpClient異常!",e);
}
} else {
LogUtil.info("ftp連接成功!");
}
return ftpClient;
}
private static void free(){
try {
ftpClient.logout();
ftpClient.disconnect();
LogUtil.info("ftp斷開連接!");
} catch (IOException e) {
LogUtil.error("ftpClient連接關閉異常",e);
}
}
/**
* ftp多文件上傳
* @param host 主機ip
* @param port 主機端口號
* @param username ftp用戶名
* @param password ftp密碼
* @param remotePath 遠程目錄
* @param localPathList 本地文件路徑集合,每個元素爲帶文件名的全路徑
* @return 上傳成功的文件個數
*/
public static int uploadMultipleFile(String host, int port, String username, String password, String remotePath, List<String> localPathList){
final int ZERO = 0;
int successNum = 0;
//連接ftp客戶端
FTPClient ftpClient = getFTPClient(host, port, username, password);
//切換工作路徑
try {
ftpClient.changeWorkingDirectory(remotePath);
} catch (IOException e) {
LogUtil.error("遠程路徑錯誤:"+remotePath,e);
return ZERO;
}
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
LogUtil.info("ftpClient未準備就緒,即將斷開連接!");
free();
return ZERO;
}else{
//準備就緒,開始上傳文件
ftpClient.enterLocalActiveMode();
String fileName = null;
for (String localPath : localPathList) {
try(InputStream in = new FileInputStream(localPath);) {
//去除路徑,獲取文件名
fileName = localPath.substring(localPath.lastIndexOf("/")+1, localPath.length());
//上傳時文件名支持中文
fileName = new String(fileName.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING);
//上傳文件
if (ftpClient.storeFile(fileName, in)) {
LogUtil.info("文件上傳成功:"+localPath);
successNum++;
}else{
LogUtil.info("文件上傳失敗:"+localPath);
}
} catch (IOException e) {
LogUtil.error("文件上傳失敗:"+localPath,e);
}
}
free();
}
return successNum;
}
/**
* 多文件下載
* @param host 主機ip
* @param port 端口號
* @param username sftp用戶名
* @param password sftp密碼
* @param srcToDstMap 每個元素的key爲帶文件名的遠程全路徑,value爲帶文件名的本地全路徑
* @return 下載成功的個數
*/
public static int downloadMultipleFile(String host, int port, String username, String password, Map<String,String> srcToDstMap){
int successNum = 0;
final int ZERO = 0;
//連接ftp客戶端
FTPClient ftpClient = getFTPClient(host, port, username, password);
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
LogUtil.info("ftpClient未準備就緒,即將斷開連接!");
free();
return ZERO;
}else{
for (Map.Entry<String, String> entry : srcToDstMap.entrySet()) {
String src = entry.getKey();
String srcForLog = src;
try(OutputStream out = new FileOutputStream(entry.getValue())){
src = new String(src.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING);
if(ftpClient.retrieveFile(src, out)){
successNum++;
LogUtil.info("ftp下載成功:"+srcForLog);
}else{
LogUtil.info("ftp下載失敗:"+srcForLog);
}
} catch (Exception e) {
LogUtil.error("ftp下載失敗:"+srcForLog, e);
}
}
free();
return successNum;
}
}
}
2、sftp
import com.jcraft.jsch.*;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@Component
public class SftpUtil {
private ChannelSftp sftp = null;
public ChannelSftp getconnect(String host, String username, String password,int port) {
try {
JSch jsch = new JSch();
jsch.getSession(username, host, port);
Session sshSession = jsch.getSession(username, host, port);
sshSession.setPassword(password);
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
sshSession.connect();
Channel channel = sshSession.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
LogUtil.info("sftp登錄成功!");
} catch (Exception e) {
LogUtil.error("sftp登錄失敗!" + e);
}
return sftp;
}
public void disconnect() {
if (this.sftp != null) {
if (this.sftp.isConnected()) {
this.sftp.disconnect();
} else if (this.sftp.isClosed()) {
LogUtil.debug("sftp is closed already");
}
}
}
/**
* 流行的
* sftp多文件上傳
* @param ip 主機ip
* @param port 主機端口號
* @param username sftp用戶名
* @param password sftp密碼
* @param remotePath 遠程目錄
* @param localPathArr 本地文件路徑集合,每個元素爲帶文件名的全路徑
* @return 上傳成功的文件個數
*/
public static int uploadMultipleFile(String ip,int port,String username,String password,String remotePath,List<String> localPathList){
SftpUtil sftpUtil = new SftpUtil();
ChannelSftp channelSftp = sftpUtil.getconnect(ip, password, username, port);
if(null == channelSftp || !channelSftp.isConnected()){
LogUtil.info("多文件上傳失敗,sftp登錄失敗!");
return 0;
}
try {
channelSftp.cd(remotePath);
} catch (SftpException e) {
LogUtil.error("遠程路徑不存在",e);
sftpUtil.disconnect();
return 0;
}
//上傳成功的文件個數
int successNum = 0;
for (String localPath : localPathList) {
File localFile = new File(localPath);
try(InputStream in = new FileInputStream(localFile)) {
channelSftp.put(in, localFile.getName());
successNum++;
} catch (Exception e) {
LogUtil.error("文件上傳失敗",e);
}
}
sftpUtil.disconnect();
return successNum;
}
/**
* 多文件下載
* @param ip 主機ip
* @param port 端口號
* @param username sftp用戶名
* @param password sftp密碼
* @param srcToDstMap 每個元素的key爲帶文件名的遠程全路徑,value爲帶文件名的本地全路徑
* @return
*/
public static int downloadMultipleFile(String ip,int port,String username,String password,Map<String,String> srcToDstMap){
SftpUtil sftpUtil = new SftpUtil();
ChannelSftp channelSftp = sftpUtil.getconnect(ip, password, username, port);
if(null == channelSftp || !channelSftp.isConnected()){
LogUtil.info("多文件上傳失敗,sftp登錄失敗!");
return 0;
}
int successNum = 0;
for (Map.Entry<String, String> entry : srcToDstMap.entrySet()) {
String src = entry.getKey();
String dst = entry.getValue();
File srcFile = new File(src);
/*if(!srcFile.isFile()){
LogUtil.error(src+"不是一個文件");
continue;
}*/
try {
channelSftp.get(src, dst);
} catch (SftpException e) {
LogUtil.error("sftp下載文件失敗:"+dst,e);
continue;
}
LogUtil.info("sftp下載文件成功:"+dst);
successNum++;
}
sftpUtil.disconnect();
return successNum;
}
}