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>