ftp-ftps-sftp的工具类

夙愿已清 提交于 2020-08-16 00:42:03

 

 

pom.xml的依赖,由依赖commons-httpclients的老板3.1其实也没有用到,需要修改。

		<dependency>
		    <groupId>com.jcraft</groupId>
		    <artifactId>jsch</artifactId>
		    <version>0.1.54</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
		<dependency>
		    <groupId>commons-io</groupId>
		    <artifactId>commons-io</artifactId>
		    <version>2.6</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/commons-net/commons-net -->
		<dependency>
		    <groupId>commons-net</groupId>
		    <artifactId>commons-net</artifactId>
		    <version>3.6</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient -->
		<dependency>
		    <groupId>commons-httpclient</groupId>
		    <artifactId>commons-httpclient</artifactId>
		    <version>3.1</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
		<!-- <dependency> -->
		    <!-- <groupId>org.apache.httpcomponents</groupId> -->
		   <!--  <artifactId>httpclient</artifactId> -->
		   <!--  <version>4.5.3</version> -->
		<!-- </dependency> -->

 

 

 

SFTPUtil.java ---SFTP工具类

package com.imddysc.springboot231app.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Vector;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class SFTPUtil {

	private static final Logger logger = LoggerFactory.getLogger(SFTPUtil.class);

	private ChannelSftp sftp;

	private Session session;
	/** SFTP 登录用户名 */
	private String username;
	/** SFTP 登录密码 */
	private String password;
	/** 私钥 */
	private String privateKey;
	/** SFTP 服务器地址IP地址 */
	private String host;
	/** SFTP 端口 */
	private int port;

	/**
	 * 构造基于密码认证的sftp对象
	 */
	public SFTPUtil(String username, String password, String host, int port) {
		this.username = username;
		this.password = password;
		this.host = host;
		this.port = port;
	}

	/**
	 * 构造基于秘钥认证的sftp对象
	 */
	public SFTPUtil(String username, String host, int port, String privateKey) {
		this.username = username;
		this.host = host;
		this.port = port;
		this.privateKey = privateKey;
	}

	public SFTPUtil() {
	}

	/**
	 * 连接sftp服务器
	 */
	public void login() {
		try {
			JSch jsch = new JSch();
			if (privateKey != null) {
				jsch.addIdentity(privateKey);// 设置私钥
			}

			session = jsch.getSession(username, host, port);

			if (password != null) {
				session.setPassword(password);
			}
			Properties config = new Properties();
			config.put("StrictHostKeyChecking", "no");

			session.setConfig(config);
			session.connect();

			Channel channel = session.openChannel("sftp");
			channel.connect();

			sftp = (ChannelSftp) channel;
		} catch (JSchException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 关闭连接 server
	 */
	public void logout() {
		if (sftp != null) {
			if (sftp.isConnected()) {
				sftp.disconnect();
			}
		}
		if (session != null) {
			if (session.isConnected()) {
				session.disconnect();
			}
		}
	}

	/**
	 * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory
	 * 
	 * @param basePath     服务器的基础路径
	 * @param directory    上传到该目录
	 * @param sftpFileName sftp端文件名
	 * @param in           输入流
	 */
	public void upload(String basePath, String directory, String sftpFileName, InputStream input) throws SftpException {
		try {
			sftp.cd(basePath);
			sftp.cd(directory);
		} catch (SftpException e) {
			// 目录不存在,则创建文件夹
			String[] dirs = directory.split("/");
			String tempPath = basePath;
			for (String dir : dirs) {
				if (null == dir || "".equals(dir))
					continue;
				tempPath += "/" + dir;
				try {
					sftp.cd(tempPath);
				} catch (SftpException ex) {
					sftp.mkdir(tempPath);
					sftp.cd(tempPath);
				}
			}
		}
		sftp.put(input, sftpFileName); // 上传文件
	}

	/**
	 * 下载文件。
	 * 
	 * @param directory    下载目录
	 * @param downloadFile 下载的文件
	 * @param saveFile     存在本地的路径
	 */
	public void download(String directory, String downloadFile, String saveFile)
			throws SftpException, FileNotFoundException {
		if (directory != null && !"".equals(directory)) {
			sftp.cd(directory);
		}
		File file = new File(saveFile);
		sftp.get(downloadFile, new FileOutputStream(file));
	}

	/**
	 * 下载文件
	 * 
	 * @param directory    下载目录
	 * @param downloadFile 下载的文件名
	 * @return 字节数组
	 */
	public byte[] download(String directory, String downloadFile) throws SftpException, IOException {
		if (directory != null && !"".equals(directory)) {
			sftp.cd(directory);
		}
		InputStream is = sftp.get(downloadFile);

		byte[] fileData = IOUtils.toByteArray(is);

		return fileData;
	}

	/**
	 * 删除文件
	 * 
	 * @param directory  要删除文件所在目录
	 * @param deleteFile 要删除的文件
	 */
	public void delete(String directory, String deleteFile) throws SftpException {
		sftp.cd(directory);
		sftp.rm(deleteFile);
	}

	/**
	 * 列出目录下的文件
	 * 
	 * @param directory 要列出的目录
	 * @param sftp
	 */
	public Vector<?> listFiles(String directory) throws SftpException {
		return sftp.ls(directory);
	}

	// 上传文件测试
	public static void main(String[] args) throws SftpException, IOException {
		SFTPUtil sftp = new SFTPUtil("sftpuser01", "123456", "192.168.0.12", 33689);
		sftp.login();
		File file = new File("D:\\ACE考试.png");
		InputStream is = new FileInputStream(file);

		sftp.upload("/upload", "2", "test_sftp.png", is);
		sftp.logout();
	}

}

 

FTPUtil.java --- FTP工具类

package com.imddysc.springboot231app.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FTPUtil {

	private static final Logger log = LoggerFactory.getLogger(FTPUtil.class);

	/**
	 * Description: 向FTP服务器上传文件
	 * 
	 * @param host     FTP服务器hostname
	 * @param port     FTP服务器端口
	 * @param username FTP登录账号
	 * @param password FTP登录密码
	 * @param basePath FTP服务器基础目录
	 * @param filePath FTP服务器文件存放路径。文件的路径为basePath+filePath
	 * @param filename 上传到FTP服务器上的文件名
	 * @param input    输入流
	 * @return 成功返回true,否则返回false
	 */
	public static boolean uploadFile(String host, int port, String username, String password, String basePath,
			String filePath, String filename, InputStream input) {
		boolean result = false;
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			ftp.connect(host, port);// 连接FTP服务器
			// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
			ftp.login(username, password);// 登录
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return result;
			}
			// 切换到上传目录
			if (!ftp.changeWorkingDirectory(basePath + filePath)) {
				// 如果目录不存在创建目录
				String[] dirs = filePath.split("/");
				String tempPath = basePath;
				for (String dir : dirs) {
					if (null == dir || "".equals(dir))
						continue;
					tempPath += "/" + dir;
					if (!ftp.changeWorkingDirectory(tempPath)) { // 进不去目录,说明该目录不存在
						if (!ftp.makeDirectory(tempPath)) { // 创建目录
							// 如果创建文件目录失败,则返回
							System.out.println("创建文件目录" + tempPath + "失败");
							return result;
						} else {
							// 目录存在,则直接进入该目录
							ftp.changeWorkingDirectory(tempPath);
						}
					}
				}
			}
			// 设置上传文件的类型为二进制类型
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			// 上传文件
			if (!ftp.storeFile(filename, input)) {
				return result;
			}
			input.close();
			ftp.logout();
			result = true;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return result;
	}

	/**
	 * Description: 从FTP服务器下载文件
	 * 
	 * @param host       FTP服务器hostname
	 * @param port       FTP服务器端口
	 * @param username   FTP登录账号
	 * @param password   FTP登录密码
	 * @param remotePath FTP服务器上的相对路径
	 * @param fileName   要下载的文件名
	 * @param localPath  下载后保存到本地的路径
	 * @return
	 */
	public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
			String fileName, String localPath) {
		boolean result = false;
		FTPClient ftp = new FTPClient();
		try {
			int reply;
			ftp.connect(host, port);
			// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
			ftp.login(username, password);// 登录
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
				return result;
			}
			ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
			FTPFile[] fs = ftp.listFiles();
			for (FTPFile ff : fs) {
				if (ff.getName().equals(fileName)) {
					File localFile = new File(localPath + "/" + ff.getName());

					OutputStream is = new FileOutputStream(localFile);
					ftp.retrieveFile(ff.getName(), is);
					is.close();
				}
			}

			ftp.logout();
			result = true;
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
				}
			}
		}
		return result;
	}

	// ftp上传文件测试main函数
	public static void main(String[] args) {
		try {
			FileInputStream in = new FileInputStream(new File("D:\\Tomcat 5.5\\pictures\\t0176ee418172932841.jpg"));
			boolean flag = uploadFile("192.168.111.128", 21, "用户名", "密码", "/www/images", "/2017/11/19", "hello.jpg",
					in);
			System.out.println(flag);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

}

 

FTPSUtil.java --- FTPS工具类

package com.imddysc.springboot231app.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPSClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FTPSUtil {
	private static final Logger logger = LoggerFactory.getLogger(FTPSUtil.class);
	public static final String NO_FILE = "No such file";
	private String username;
	private String password;
	private String host;
	private int port;
	private FTPSClient ftpClient = new FTPSClient();
	private FileOutputStream fos = null;

	public FTPSUtil(String username, String password, String host, int port) {
		this.username = username;
		this.password = password;
		this.host = host;
		this.port = port;
	}

	public boolean connect() {
		try {
			logger.info("开始连接...");
			logger.info("[username]" + username + "[host]" + host + "[port]" + port + "[password]" + password);
			// 连接

			this.ftpClient.connect(host, port);
			int reply = this.ftpClient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				this.ftpClient.disconnect();
				return false;
			}
			// 登录
			logger.info("开始登录!");
			this.ftpClient.login(username, password);
			this.ftpClient.setBufferSize(1024 * 30);
			this.ftpClient.setDataTimeout(600000);
			this.ftpClient.setControlKeepAliveReplyTimeout(12000);
			this.ftpClient.setControlKeepAliveTimeout(1200);
			this.ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
			this.ftpClient.execPROT("P");
			this.ftpClient.enterLocalPassiveMode(); // 设置被动模式去传输
			this.ftpClient.setUseEPSVwithIPv4(true);
			this.ftpClient.setControlEncoding("utf8");
			logger.info("登录成功!");
			return true;
		} catch (SocketException e) {
			logger.error("连接失败!", e);
			return false;
		} catch (Exception e) {
			logger.error("下载失败!", e);
			return false;
		}
	}

	private boolean downFileOrDirNoClose(String ftpFileName, String localDir) {
		boolean flag = false;
		try {
			// 源文件
			File file = new File(ftpFileName);
			// 目标文件
			File temp = new File(localDir);
			if (!temp.exists()) {
				temp.mkdirs();
			}
			ftpClient.enterLocalPassiveMode();
			// 判断是否是目录
			if (isDir(ftpFileName)) {
				String[] names = ftpClient.listNames();
				for (int i = 0; i < names.length; i++) {
					logger.info(names[i] + "^^^^^^^^^^^^^^");
					if (isDir(names[i])) {
						downFileOrDirNoClose(ftpFileName + '/' + names[i], localDir + File.separator + names[i]);
						ftpClient.changeToParentDirectory();
					} else {
						File localfile = new File(localDir + File.separator + names[i]);
						if (!localfile.exists()) {
							fos = new FileOutputStream(localfile);
							ftpClient.retrieveFile(names[i], fos);
						} else {
							// 文件已存在,先进行删除
							logger.debug("开始删除已存在文件");
							file.delete();
							logger.debug("已存在文件已经删除");
							fos = new FileOutputStream(localfile);
							ftpClient.retrieveFile(ftpFileName, fos);
						}
					}
				}
			} else {
				File localfile = new File(localDir + File.separator + file.getName());
				if (!localfile.exists()) {
					fos = new FileOutputStream(localfile);
					if (ftpClient.retrieveFile(ftpFileName, fos)) {
						logger.info("下载成功");
						return true;
					} else {
						logger.info("下载失败");
						return false;
					}

				} else {
					// 文件已存在,先进行删除
					logger.debug("开始删除已存在文件");
					file.delete();
					logger.debug("已存在文件已经删除");
					fos = new FileOutputStream(localfile);
					if (ftpClient.retrieveFile(ftpFileName, fos)) {
						logger.info("下载成功");
						return true;
					} else {
						logger.info("下载失败");
						return false;
					}
				}
			}
			flag = true;

		} catch (SocketException e) {
			logger.error("连接失败!", e);
		} catch (Exception e) {
			logger.error("下载失败!", e);
		}
		return flag;
	}

	/**
	 * * 手动关闭连接
	 */
	public void closeFtpClient() {
		try {
			ftpClient.logout();
		} catch (IOException e) {
			logger.error("ftpClient.logout()执行失败", e);
		}
		close(fos);
	}

	/**
	 * * 关闭连接及输出流 * * @param fos
	 */
	private void close(FileOutputStream fos) {
		try {

			if (fos != null) {
				fos.close();
			}
			logger.info("退出登录");
			if (this.ftpClient != null) {
				try {
					ftpClient.disconnect();
					ftpClient = null;
				} catch (IOException ioe) {
					logger.error("ftpClient.disconnect()执行失败", ioe);
				}

			}
			logger.info("关闭连接");
		} catch (IOException e) {
			logger.error("关闭连接失败", e);
		}
	}

	public boolean downloadFile(String ftpFileName, String localDir) {
		boolean loginFlag = connect();
		boolean flag = false;
		if (loginFlag) {
			flag = downFileOrDirNoClose(ftpFileName, localDir);
		}
		return flag;
	}

	/**
	 * * 判断是否是目录 * * @param fileName * @return
	 */
	public boolean isDir(String fileName) {
		boolean flag = false;
		try {
			// 切换目录,若当前是目录则返回true,否则返回false。
			flag = ftpClient.changeWorkingDirectory(fileName);
		} catch (Exception e) {
			logger.error("判断目录失败", e);
		}
		return flag;
	}

	/**
	 * * * @param strRemotePath 上传目录 * @param strLocalPath 上传文件在达飞的地址 * @param
	 * remoteFileName 上传后的命名 * @return
	 */
	public boolean uploadFile(String strRemotePath, String strLocalPath, String remoteFileName) {
		if (!this.ftpClient.isConnected()) {
			connect();
		}

		boolean flag = false;
		if (this.ftpClient.isConnected()) {
			File file = new File(strLocalPath);
			InputStream input = null;
			try {
				input = new FileInputStream(file);
				if (!ftpClient.changeWorkingDirectory(strRemotePath)) {
					// 如果目录不存在创建目录
					String[] dirs = strRemotePath.split("/");
					String tempPath = "";
					for (String dir : dirs) {
						if (null == dir || "".equals(dir))
							continue;
						tempPath += "/" + dir;
						if (!ftpClient.changeWorkingDirectory(tempPath)) {
							if (!ftpClient.makeDirectory(tempPath)) {
								logger.error("创建远程目录失败");
							} else {
								ftpClient.changeWorkingDirectory(tempPath);
							}
						}
					}
				}
				flag = this.ftpClient.storeFile(remoteFileName, input);
			} catch (Exception e) {
				logger.info("文件上传失败");
			} finally {
				if (input != null) {
					try {
						input.close();
						ftpClient.disconnect();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
		}
		return flag;
	}

	/**
	 * * 下载 * * @param strUrlPath * @param strLocalPath * @param strFolderPath
	 * * @return
	 */
	public boolean downloadFile(String strUrlPath, String strLocalPath, String strFolderPath) {
		boolean result = true;
		GetMethod httpGet = new GetMethod(strUrlPath);
		if (!strFolderPath.equals("")) {
			File Folder = new File(strFolderPath);
			if (!Folder.exists()) {
				System.out.println(Folder.mkdirs());
			}
		}

		InputStream in = null;
		FileOutputStream out = null;
		try {
			HttpClient httpClient = new HttpClient();
			httpClient.executeMethod(httpGet);
			in = httpGet.getResponseBodyAsStream();
			out = new FileOutputStream(new File(strLocalPath));
			byte[] b = new byte[1024];
			int len = 0;
			while ((len = in.read(b)) != -1) {
				out.write(b, 0, len);
			}
			in.close();
			out.close();
		} catch (Exception e) {
			logger.error("httpClient下载文件失败", e);
			result = false;
		} finally {
			httpGet.releaseConnection();
			try {
				if (in != null) {
					in.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (Exception e1) {
				logger.error("文件流信息关闭失败", e1);
				result = false;
			}

		}
		logger.info("####下载文件成功:" + strUrlPath);
		return result;
	}

	public static void main(String[] args) throws FileNotFoundException {
		String adder = "";
		int port = 22;
		String userName = "";
		String passWord = "";
		FTPSUtil ftp = new FTPSUtil(userName, passWord, adder, port);
		ftp.uploadFile("upload/2019/04/29", "E:\\f981dbde6f944b3f974a20eed1b3b69b.zip", "test.zip");

	}

}

 

 

 

后记备注:
private FTPSClient ftpConnection(String host, int port, String userName, String passWord) {
    FTPSClient ftpClient = null;
    try {
        ftpClient = new FTPSClient("TLS", true);
        ftpClient.connect(host, port);
        ftpClient.login(userName, passWord);
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        ftpClient.setDataTimeout(18000);
        ftpClient.execPROT("P");
        ftpClient.enterLocalPassiveMode();
        LOGGER.info("FTPSERVICE.ftpConnection  ftpconnection success");
    } catch (Exception e) {
        LOGGER.error("FTPSERVICE.ftpConnection  ftpconnection EXception:", e);
    }
    return ftpClient;
}


 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!