Ftp连接服务端向服务端发送文件

package com.receive.tools;

import java.io.File;
import java.io.FileInputStream;
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.apache.log4j.Logger;

/**
 * FTP工具类
 */
public class FtpUtils {

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

	// ftp服务器地址
	private static final String hostName = PropertiesReader.getProperty("ftp.hostName");
	// ftp服务器端口号默认为21
	private static final Integer port = PropertiesReader.getIntProperty("ftp.port", 21);
	// ftp登录账号
	private static final String userName = PropertiesReader.getProperty("ftp.userName");
	// ftp登录密码
	private static final String passWord = PropertiesReader.getProperty("ftp.passWord");
	// 操作文件路径
	private static final String path = PropertiesReader.getProperty("ftp.path");

	// ftp客户端实例对象
	private static FTPClient ftpClient;

	static {
		ftpClient = new FTPClient();
		ftpClient.setControlEncoding("utf-8");
	}

	/**
	 * 登陆ftp服务器
	 * 
	 * @return 是否登陆成功
	 */
	private static final boolean loginFTP() {
		try {
			ftpClient.connect(hostName, port); // 连接ftp服务器
			ftpClient.login(userName, passWord); // 登录ftp服务器
			int replyCode = ftpClient.getReplyCode(); // 是否成功登录服务器
			if (!FTPReply.isPositiveCompletion(replyCode)) {
				logger.error("连接ftp服务器失败:" + hostName + ":" + port);
				System.out.println("连接ftp服务器失败:" + hostName + ":" + port);
				ftpClient.disconnect();
				return false;
			}
			logger.info("连接ftp服务器成功:" + hostName + ":" + port);
			System.out.println("连接ftp服务器成功:" + hostName + ":" + port);
			ftpClient.makeDirectory(path);
			ftpClient.changeWorkingDirectory(path);
		} catch (Exception e) {
			logger.error("异常信息为", e);
			System.out.println("异常信息为" + e);
		}
		return true;
	}

	/**
	 * 上传文件
	 * 
	 * @param fileName
	 *            上传到ftp的文件名
	 * @param originFileName
	 *            上传文件的原始绝对路径
	 * @return
	 */
	private static final boolean uploadFile(String fileName, String originFileName) {
		boolean result = false;
		InputStream inputStream = null;
		try {
			inputStream = new FileInputStream(new File(originFileName));
			ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
			result = ftpClient.storeFile(fileName, inputStream);
			inputStream.close();
			if (result) {
				logger.info("上传文件成功 " + fileName);
				System.out.println("上传文件成功 " + fileName);
			}
		} catch (Exception e) {
			logger.error("上传文件失败 " + fileName);
			System.out.println("上传文件失败 " + fileName);
			logger.error("异常信息为 " + e.getMessage());
			System.out.println("异常信息为 " + e.getMessage());
			close();
		} finally {
			if (null != inputStream) {
				try {
					inputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return result;
	}

	/**
	 * 判断ftp服务器文件是否存在
	 * 
	 * @param path
	 * @return
	 * @throws IOException
	 */
	private static final boolean existFile(String fileName) {
		boolean flag = false;
		FTPFile[] ftpFileArr;
		try {
			ftpFileArr = ftpClient.listFiles(fileName);
			if (ftpFileArr.length > 0) {
				flag = true;
				logger.info("查找文件成功,且存在 " + fileName);
				System.out.println("查找文件成功,且存在 " + fileName);
			} else {
				logger.info("查找文件不存在 " + fileName);
				System.out.println("查找文件不存在 " + fileName);
			}
		} catch (IOException e) {
			logger.error("查找文件失败 " + fileName);
			System.out.println("查找文件失败 " + fileName);
			logger.error("异常信息为 ", e);
			System.out.println("异常信息为 " + e);
			close();
		}
		return flag;
	}

	/**
	 * * 下载文件 *
	 * 
	 * @param filename
	 *            文件名称 *
	 * @param localpath
	 *            下载后的文件路径 *
	 * @return
	 */
	@SuppressWarnings("unused")
	private static final boolean downloadFile(String fileName, String localpath) {
		boolean flag = false;
		OutputStream os = null;
		try {
			FTPFile[] ftpFiles = ftpClient.listFiles();
			for (FTPFile file : ftpFiles) {
				if (fileName.equalsIgnoreCase(file.getName())) {
					File localFile = new File(localpath + File.separator + file.getName());
					os = new FileOutputStream(localFile);
					ftpClient.retrieveFile(file.getName(), os);
					os.close();
				}
			}
			flag = true;
			logger.info("下载文件成功 " + fileName);
			System.out.println("下载文件成功 " + fileName);
		} catch (Exception e) {
			logger.error("下载文件失败 " + fileName);
			System.out.println("下载文件失败 " + fileName);
			logger.error("异常信息为 ", e);
			System.out.println("异常信息为 " + e);
			close();
		} finally {
			if (null != os) {
				try {
					os.close();
				} catch (IOException e) {
					logger.error("异常信息为 ", e);
					System.out.println("异常信息为 " + e);
				}
			}
		}
		return flag;
	}

	/**
	 * * 删除文件 *
	 * 
	 * @param pathname
	 *            FTP服务器保存目录 *
	 * @param filename
	 *            要删除的文件名称 *
	 * @return
	 */
	private static final boolean deleteFile(String fileName) {
		boolean flag = false;
		try {
			if (FTPReply.FILE_ACTION_OK == ftpClient.dele(fileName)) {
				flag = true;
				logger.info("删除文件成功 " + fileName);
				System.out.println("删除文件成功 " + fileName);
			} else {
				logger.info("删除文件失败 " + fileName);
				System.out.println("删除文件失败 " + fileName);
			}
		} catch (Exception e) {
			logger.error("删除文件失败 " + fileName);
			System.out.println("删除文件失败 " + fileName);
			logger.error("异常信息为 " + e.getMessage());
			System.out.println("异常信息为 " + e.getMessage());
		}
		return flag;
	}

	/**
	 * 重命名文件
	 * 
	 * @param srcFname
	 *            原文件名
	 * @param targetFname
	 *            新文件名
	 * @return
	 */
	private static final boolean renameFile(String srcFname, String targetFname) {
		boolean flag = false;
		if (ftpClient != null) {
			try {
				flag = ftpClient.rename(srcFname, targetFname);
				if (flag) {
					logger.info("重命名文件成功,原文件名为 " + srcFname + ",重命名后文件名为 " + targetFname);
					System.out.println("重命名文件成功,原文件名为 " + srcFname + ",重命名后文件名为 " + targetFname);
				}
			} catch (IOException e) {
				logger.error("重命名文件失败,原文件名为 " + srcFname);
				System.out.println("重命名文件失败,原文件名为 " + srcFname);
				logger.error("异常信息为 ", e);
				System.out.println("异常信息为 " + e);
				close();
			}
		}
		return flag;
	}

	/**
	 * 关闭ftp客户端,释放资源
	 */
	private static final void close() {
		if (null != ftpClient) {
			if (ftpClient.isConnected()) {
				try {
					ftpClient.disconnect();
				} catch (IOException e) {
					logger.error("异常信息为 ", e);
					System.out.println("异常信息为 " + e);
				}
			}
		}
	}

	/**
	 * ftp 上传文件
	 * 
	 * @param fielPath
	 *            文件完整路径
	 * @return
	 */
	public static boolean ftpUploadFile(String filePath) {
		if (loginFTP()) {// 登陆ftp服务器
			String fileName = filePath;
			fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1, fileName.length());
			String newFileName = fileName + ".tmp";
			if (uploadFile(newFileName, filePath)) {// 上传文件
				if (existFile(newFileName)) {// 判断指定文件是否存在
					if (deleteFile(newFileName)) {// 删除存在的文件
						if (renameFile(newFileName, fileName)) {// 删除成功后重命名文件
							if (DirFileUtils.deleteFile(filePath)) {// 删除本机的此文件
								return true;
							}
						}
					}
				} else {
					if (renameFile(newFileName, fileName)) {// 重命名文件
						if (DirFileUtils.deleteFile(filePath)) {// 删除本机的此文件
							return true;
						}
					}
				}
			}
		}
		close(); // 关闭客户端
		return false;
	}

}
需要引入maven依赖
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>

猜你喜欢

转载自blog.csdn.net/dai_haijiao/article/details/80183180
今日推荐