java ftp 单个上传 单个下载 批量上传 批量下载

本文介绍了一个用于Java的FTP工具类,详细展示了如何通过该工具类实现FTP文件的上传、下载及目录操作。文章深入解释了工具类的内部实现,包括配置加载、FTP连接建立、文件操作等关键环节。

依赖

<dependency>
	<groupId>commons-net</groupId>
	<artifactId>commons-net</artifactId>
	<version>3.7</version>
</dependency>

完整的JAVA工具类

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.logging.Logger;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class FTPUtil {

	protected static Logger logger = Logger.getLogger(FTPUtil.class.getName());

	/**
	 * FTP地址
	 **/
	private static String ftpHost;

	/**
	 * FTP端口
	 **/
	private static int ftpPort = 21;

	/**
	 * FTP用户名
	 **/
	private static String ftpUsername;

	/**
	 * FTP密码
	 **/
	private static String ftpPassword;

	/**
	 * FTP协议里面,规定文件名编码为iso-8859-1
	 **/
	private static String serverCharset = "ISO-8859-1";

	/**
	 * UTF-8字符编码
	 **/
	private static final String CHARSET_UTF8 = "UTF-8";

	/**
	 * 设置缓冲区大小4M
	 **/
	private static final int BUFFER_SIZE = 1024 * 1024 * 4;

	/**
	 * 加载ftp配置信息
	 */
	static {
		try {
			Properties properties = new Properties();
			InputStream in = FTPUtil.class.getClassLoader().getResourceAsStream("application.properties");
			properties.load(in);
			ftpHost = properties.getProperty("ftp.host");
			String port = properties.getProperty("ftp.port");
			if (port != null && !"".equals(port)) {
				ftpPort = Integer.valueOf(port);
			}
			ftpUsername = properties.getProperty("ftp.username");
			ftpPassword = properties.getProperty("ftp.password");
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 下载单个文件
	 * 
	 * @param ftpFilePath
	 *            /usr/java/test/test3/CorsApplicationTests.java
	 * @param localPath
	 *            F:\\bak\\bak19\\v6\\v1
	 * @return
	 */
	public static boolean get(String ftpFilePath, String localPath) {
		FTPClient ftpClient = null;
		try {
			// build client
			ftpClient = buildClient();

			// get
			ftpFilePath = ftpFilePath.replaceAll("\\\\", "/");
			int index = ftpFilePath.lastIndexOf("/");
			String fileName = ftpFilePath.substring(index + 1);
			String ftpPath = ftpFilePath.substring(0, index);
			FileOutputStream fos = new FileOutputStream(new File(localPath + "/" + fileName));

			ftpClient.changeWorkingDirectory(ftpPath);
			boolean isSucess = ftpClient.retrieveFile(fileName, fos);
			fos.close();
			return isSucess;
		} catch (Exception e) {
			e.printStackTrace();
			logger.warning("ftp get fail:" + e.getMessage());
		}
		return false;
	}

	/**
	 * 上传单个文件
	 * 
	 * @param localFilePath
	 *            F:\\bak\\bak19\\v6\\v1\\CorsApplication.java
	 * @param ftpPath
	 *            /usr/java/test/
	 * @return
	 */
	public static boolean push(String localFilePath, String ftpPath) {
		FTPClient ftpClient = null;
		try {
			// build client
			ftpClient = buildClient();

			// push
			ftpPath = ftpPath.replaceAll("\\\\", "/");
			File file = new File(localFilePath);
			FileInputStream fis = new FileInputStream(file);
			ftpClient.changeWorkingDirectory(ftpPath);
			boolean isSucess = ftpClient.storeFile(file.getName(), fis);
			fis.close();
			return isSucess;
		} catch (Exception e) {
			e.printStackTrace();
			logger.warning("ftp push fail:" + e.getMessage());
		}
		return false;
	}

	/**
	 * 下载整个文件夹
	 * 
	 * @param ftpPath
	 *            /usr/local/tmp
	 * @param localPath
	 *            F:/bak/v1
	 * @return
	 */
	public static boolean downloadFolder(String ftpPath, String localPath) {
		FTPClient ftpClient = null;
		try {
			// build client
			ftpClient = buildClient();

			// downloadFiles
			File savePathFile = new File(localPath);
			if (!savePathFile.exists()) {
				savePathFile.mkdirs();
			}
			downloadFiles(ftpClient, ftpPath, localPath);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			logger.warning("ftp download fail:" + e.getMessage());
		} finally {
			// close
			close(ftpClient);
		}
		return false;
	}

	/**
	 * 上传整个文件夹
	 * 
	 * @param localPath
	 *            F:\\bak\\bak19\\v6\\v1
	 * @param ftpPath
	 *            /usr/java/test/test3
	 * @return
	 */
	public static boolean uploadFolder(String localPath, String ftpPath) {
		FTPClient ftpClient = null;
		try {
			// build client
			ftpClient = buildClient();

			// uploadFiles
			uploadFiles(ftpClient, localPath, ftpPath);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			logger.warning("ftp uploadFolder fail:" + e.getMessage());
		} finally {
			// close
			close(ftpClient);
		}
		return false;
	}

	/**
	 * 递归下载所有文件
	 * 
	 * @param ftpClient
	 * @param ftpPath
	 * @param localPath
	 * @return
	 */
	public static boolean downloadFiles(FTPClient ftpClient, String ftpPath, String localPath) throws IOException {
		// 判断是否存在该目录
		if (!ftpClient.changeWorkingDirectory(ftpPath)) {
			logger.warning(ftpPath + "该目录不存在");
			return Boolean.FALSE;
		}
		FTPFile[] ftpFileArr = ftpClient.listFiles();
		if (ftpFileArr == null || ftpFileArr.length == 0) {
			return Boolean.FALSE;
		}
		for (FTPFile file : ftpFileArr) {
			String fileName = file.getName();
			if (file.isFile()) {
				String ftpName = new String(fileName.getBytes(serverCharset), CHARSET_UTF8);
				File saveFile = new File(localPath + '/' + ftpName);
				try (FileOutputStream fos = new FileOutputStream(saveFile)) {
					ftpClient.retrieveFile(file.getName(), fos);
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (file.isDirectory()) {
				String dirName = localPath + "/" + fileName;
				File dirFile = new File(dirName);
				if (!dirFile.exists()) {
					dirFile.mkdirs();
				}
				downloadFiles(ftpClient, ftpPath + "/" + fileName, dirName);
			}
		}
		return Boolean.TRUE;
	}

	/**
	 * 递归上传所有文件
	 * 
	 * @param localPath
	 * @param ftpPath
	 * @return
	 */
	public static boolean uploadFiles(FTPClient ftpClient, String localPath, String ftpPath) throws IOException {
		ftpClient.changeWorkingDirectory(ftpPath);
		File localPathFile = new File(localPath);
		if (!localPathFile.exists()) {
			return false;
		}
		File[] fileArr = localPathFile.listFiles();
		for (File file : fileArr) {
			if (file.isFile()) {
				try (FileInputStream fis = new FileInputStream(file)) {
					ftpClient.storeFile(file.getName(), fis);
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (file.isDirectory()) {
				String pathname = ftpPath + "/" + file.getName();
				ftpClient.makeDirectory(pathname);
				uploadFiles(ftpClient, file.getPath(), pathname);
			}
		}
		return true;
	}

	/**
	 * 构造FTPClient
	 * 
	 * @return
	 */
	private static FTPClient buildClient() throws Exception {
		FTPClient ftpClient = new FTPClient();
		ftpClient.setConnectTimeout(1000 * 60);
		ftpClient.connect(ftpHost, ftpPort);
		ftpClient.login(ftpUsername, ftpPassword);
		ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
		// 限制缓冲区大小
		ftpClient.setBufferSize(BUFFER_SIZE);
		int reply = ftpClient.getReplyCode();
		if (!FTPReply.isPositiveCompletion(reply)) {
			ftpClient.logout();
			ftpClient.disconnect();
			logger.warning("FTP服务器连接失败");
			throw new Exception("connect ftp server fail");
		}
		// 设置被动模式,开通一个端口来传输数据
		ftpClient.enterLocalPassiveMode();
		return ftpClient;
	}

	/**
	 * 关闭FTP客户端
	 * 
	 * @param ftpClient
	 */
	private static void close(FTPClient ftpClient) {
		if (ftpClient != null) {
			try {
				ftpClient.logout();
				ftpClient.disconnect();
			} catch (IOException e) {
				e.printStackTrace();
				logger.warning("ftp logout fail:" + e.getMessage());
			}
		}
	}

	public static void main(String[] args) {
		long lstart = System.currentTimeMillis();
		// boolean isSuccess = FTPUtil.downloadFolder("/usr/java/test/test",
		// "F:\\bak\\bak19\\v6\\v1");
		// boolean isSuccess = FTPUtil.uploadFolder("F:\\bak\\bak19\\v6\\v1",
		// "/usr/java/test/test3");
		boolean isSuccess = FTPUtil.get("/usr/java/test/test3/IndexController.java", "F:\\bak\\bak19\\v6\\v1");
		// boolean isSuccess =
		// FTPUtil.push("F:\\bak\\bak19\\v6\\v1\\CorsApplication.java","/usr/java/test/test/");

		System.out.println("total time:" + (System.currentTimeMillis() - lstart) + " ms");
		System.out.println("isSuccess:" + isSuccess);
	}
}

配置文件application.properties

server.port=8000

ftp.host=192.168.152.128
ftp.port=21
ftp.username=administrator
ftp.password=123456

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值