通过FTP协议进行文件的上传下载

通过FTP协议进行文件的上传下载

我们在做WEB项目时,往往会遇到图片的上传与下载,在这里我说一下java是如何通过ftp协议进行文件上传和下载的。不足之处,还请提出您宝贵的意见,话不多说,代码如下:
/**
 *
 */
package fw;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.SocketException;

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

/**
 * @author LSD
 * 
 * @data 2020年3月19日
 */
public class FTPUtil {
	private static Logger logger = Logger.getLogger(FTPUtil.class);

	/**
	 * 
	 * @Description: 		获取FTPClient对象
	 * @author LSD
	 * @date 2020年3月19日
	 * @param ftpHost		服务器IP
	 * @param ftpPort		服务器端口号
	 * @param ftpUserName	用户名
	 * @param ftpPassword	密码
	 * @return				FTPClient对象
	 */
	public FTPClient getFTPClient(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword) {

		FTPClient ftp = null;
		try {
			ftp = new FTPClient();
			// 连接FPT服务器,设置IP及端口
			ftp.connect(ftpHost, ftpPort);
			// 设置用户名和密码
			ftp.login(ftpUserName, ftpPassword);
			// 设置连接超时时间,5000毫秒
			ftp.setConnectTimeout(50000);
			// 设置中文编码集,防止中文乱码
			ftp.setControlEncoding("UTF-8");
			if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
				logger.info("未连接到FTP,用户名或密码错误");
				ftp.disconnect();
			} else {
				logger.info("FTP连接成功");
			}

		} catch (SocketException e) {
			e.printStackTrace();
			logger.info("FTP的IP地址可能错误,请正确配置");
		} catch (IOException e) {
			e.printStackTrace();
			logger.info("FTP的端口错误,请正确配置");
		}
		return ftp;
	}
	
	/**
	 * @Description:		关闭FTP方法
	 * @author LSD
	 * @date 2020年3月19日
	 * @param ftp			FTPClient对象
	 * @return				boolean值
	 */
	public boolean closeFTP(FTPClient ftp) {

		try {
			ftp.logout();
		} catch (Exception e) {
			logger.error("FTP关闭失败");
		} finally {
			if (ftp.isConnected()) {
				try {
					ftp.disconnect();
				} catch (IOException ioe) {
					logger.error("FTP关闭失败");
				}
			}
		}

		return false;

	}
	
	/**
	 * @Description:		下载FTP下指定文件
	 * @author LSD
	 * @date 2020年3月19日
	 * @param ftp			FTPClient对象
	 * @param filePath		FTP文件路径
	 * @param fileName		文件名
	 * @param downPath		下载保存的目录
	 * @return				boolean值
	 */
	public boolean downLoadFTP(FTPClient ftp, String filePath, String fileName, String downPath) {
		// 默认失败
		boolean flag = false;

		try {
			// 跳转到文件目录
			ftp.changeWorkingDirectory(new String(filePath.getBytes("GBK"), "ISO-8859-1"));
			// 获取目录下文件集合
			ftp.enterLocalPassiveMode();
			FTPFile[] files = ftp.listFiles();
			for (FTPFile file : files) {
				// 取得指定文件并下载
				if (file.getName().equals(fileName)) {
					File downFile = new File(downPath + "/" + file.getName());
					OutputStream out = new FileOutputStream(downFile);
					// 绑定输出流下载文件,需要设置编码集,不然可能出现文件为空的情况
					flag = ftp.retrieveFile(new String(file.getName().getBytes("GBK"), "ISO-8859-1"), out);
					// 下载成功删除文件,看项目需求
					// ftp.deleteFile(new
					// String(fileName.getBytes("UTF-8"),"ISO-8859-1"));
					out.flush();
					out.close();
					if (flag) {
						logger.info("下载成功");
					} else {
						logger.error("下载失败");
					}
				}
			}

		} catch (Exception e) {
			logger.error("下载失败");
		}

		return flag;
	}
	
	/**
	 * @Description:		FTP文件上传工具类
	 * @author LSD
	 * @date 2020年3月19日
	 * @param ftp			FTPClient对象
	 * @param filePath		文件路径
	 * @param ftpPath		FTP文件路径
	 * @return				boolean值
	 */
	public boolean uploadFile(FTPClient ftp, String filePath, String ftpPath) {
		boolean flag = false;
		InputStream in = null;
		try {
			// 设置PassiveMode传输
			ftp.enterLocalPassiveMode();
			// 设置二进制传输,使用BINARY_FILE_TYPE,ASC容易造成文件损坏
			ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
			// 判断FTP目标文件夹时候存在不存在则创建
			if (!ftp.changeWorkingDirectory(ftpPath)) {
				ftp.makeDirectory(ftpPath);
			}
			// 跳转目标目录
			ftp.changeWorkingDirectory(ftpPath);

			// 上传文件
			File file = new File(filePath);
			in = new FileInputStream(file);
			String tempName = ftpPath + "/" + file.getName();
			System.out.println("路径:" + tempName);
			flag = ftp.storeFile(new String(tempName.getBytes("GBK"), "ISO-8859-1"), in);
			System.out.println("true or false?:" + flag);
			if (flag) {
				logger.info("上传成功");
			} else {
				logger.error("上传失败");
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("上传失败");
		} finally {
			try {
				in.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return flag;
	}
	
	/**
	 * @Description:		遍历解析文件夹下所有文件
	 * @author LSD
	 * @date 2020年3月19日
	 * @param folderPath	需要解析的文件夹
	 * @param ftp			FTPClient对象
	 */
	public boolean readFileByFolder(FTPClient ftp, String folderPath) {
		boolean flage = false;
		try {
			ftp.changeWorkingDirectory(new String(folderPath.getBytes("UTF-8"), "ISO-8859-1"));
			// 设置FTP连接模式
			ftp.enterLocalPassiveMode();
			// 获取指定目录下文件文件对象集合
			FTPFile files[] = ftp.listFiles();
			InputStream in = null;
			BufferedReader reader = null;
			for (FTPFile file : files) {
				// 判断为txt文件则解析
				if (file.isFile()) {
					String fileName = file.getName();
					if (fileName.endsWith(".txt")) {
						in = ftp.retrieveFileStream(new String(file.getName().getBytes("UTF-8"), "ISO-8859-1"));
						reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
						String temp;
						StringBuffer buffer = new StringBuffer();
						while ((temp = reader.readLine()) != null) {
							buffer.append(temp);
						}
						if (reader != null) {
							reader.close();
						}
						if (in != null) {
							in.close();
						}
						// ftp.retrieveFileStream使用了流,需要释放一下,不然会返回空指针
						ftp.completePendingCommand();
						// 这里就把一个txt文件完整解析成了个字符串,就可以调用实际需要操作的方法
						System.out.println(buffer.toString());
					}
				}
				// 判断为文件夹,递归
				if (file.isDirectory()) {
					String path = folderPath + File.separator + file.getName();
					readFileByFolder(ftp, path);
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
			logger.error("文件解析失败");
		}

		return flage;

	}

	/**
	 * @Description: 
	 * @author LSD
	 * @date 2020年3月19日
	 * @param ftpHost		主机名
	 * @param ftpUserName	用户名
	 * @param ftpPassword	密码
	 * @param filePath		FTP文件路径
	 * @param fileName		文件名
	 * @param downPath		下载保存的目录
	 * @param ftpPath		FTP文件路径
	 */
	public static void main(String[] args) {
		FTPUtil test = new FTPUtil();
		FTPClient ftp = test.getFTPClient("ftpHost", 21, "ftpUserName", "ftpPassword");
		// 下载
		// test.downLoadFTP(ftp, "filePath", "fileName", "downPath");
		// 上传
		// test.uploadFile(ftp, "filePath", "ftpPath");
		test.readFileByFolder(ftp, "/");
		test.closeFTP(ftp);
		System.exit(0);
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值