package com.cmbc.runbatch.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; 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.FTPClient; import org.apache.commons.net.ftp.FTPReply; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FtpUtil { private static final Logger logger = LoggerFactory.getLogger(FtpUtil.class); private static final int BYTE_SIZE = 1024; /** * ftp服务器地址 */ private String host; /** * ftp端口 */ private int port; /** * ftp用户名 */ private String userName; /** * ftp用户 */ private String password; /** * 从FTP上下载文件的路径 */ private String downloadPath; /** * 上传文件到FTP的路径 */ private String uploadPath; /** * 连接FTP服务器 * * @return ftpClient ftp服务器连接对象 */ private FTPClient connectFTPClient() { FTPClient ftpClient = new FTPClient(); try { ftpClient = new FTPClient(); ftpClient.connect(host, port);// 连接FTP服务器 ftpClient.login(userName, password);// 登陆FTP服务器 ftpClient.setControlEncoding("UTF-8"); ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); logger.info("连接TFP,host={},port={},userName={},passWord={}", host, port, userName, password); if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { logger.error("连接FTP失败,用户名或密码错误!"); ftpClient.disconnect(); } else { logger.info("FTP连接成功!"); } } catch (Exception e) { logger.error("error:", e); } return ftpClient; } /** * 从ftp服务器批量下载文件 * * @param localPath * 下载文件在本地的保存路径 * @param ftpFileNames * 需要下载的文件列表 * * @return true 下载成功 false下载失败 */ public boolean downloadFilesFromFTP(String localPath, String[] ftpFileNames) { FTPClient ftpClient = null; OutputStream os = null; InputStream in = null; boolean isDownloadSuccess = false; try { ftpClient = connectFTPClient(); if (ftpClient == null) { return false; } if (!ftpClient.changeWorkingDirectory(downloadPath)) { logger.error("FTP目录切换失败"); return false; } for (String ftpFileName : ftpFileNames) { logger.info("FTP下载路径{},文件{}", downloadPath, ftpFileName); // 判断FTP上文件是否存在 in = ftpClient.retrieveFileStream(ftpFileName); if (in == null || ftpClient.getReplyCode() == FTPReply.FILE_UNAVAILABLE) { logger.error("FTP服务器上文件 " + downloadPath + ftpFileName + "不存在!"); return false; } ftpClient.completePendingCommand(); if (in != null) { in.close(); } // 从ftp上下载文件 File localFile = new File(localPath + ftpFileName); if (localFile.exists()) { localFile.delete(); } else { if (!localFile.getParentFile().exists()) { localFile.getParentFile().mkdirs(); } } localFile.createNewFile(); os = new FileOutputStream(localFile); if (!ftpClient.retrieveFile(localFile.getName(), os)) { logger.error("文件" + downloadPath + ftpFileName + "下载失败!"); return false; } } ftpClient.logout(); isDownloadSuccess = true; } catch (Exception e) { logger.error("error", e); } finally { if (os != null) { try { os.flush(); os.close(); } catch (IOException e) { logger.error("FileOutputStream关闭失败:", e); } } if (in != null) { try { in.close(); } catch (IOException e) { logger.error("FileInputStream关闭失败:", e); } } if (ftpClient != null && ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException e) { logger.error("FTP连接关闭失败:", e); } } } return isDownloadSuccess; } /** * 批量上传文件到ftp服务器 * * @param localFile * 上传的文件数组 * @return true 上传成功 false 上传失败 */ public boolean uploadFilesToFTP(File[] localFiles) { FileInputStream in = null; FTPClient ftpClient = null; ByteArrayInputStream byteIn = null; try { ftpClient = connectFTPClient(); if (ftpClient == null) { return false; } if (!ftpClient.changeWorkingDirectory(uploadPath)) { logger.error("FTP目录切换失败"); return false; } // 上传文件 for (File localFile : localFiles) { logger.info("FTP上传路径:{},文件={}", uploadPath, localFile.toString()); in = new FileInputStream(localFile); ByteArrayOutputStream resout = new ByteArrayOutputStream(); int read = -1; byte[] indata = new byte[BYTE_SIZE]; while ((read = in.read(indata)) != -1) { resout.write(indata, 0, read); } byteIn = new ByteArrayInputStream(resout.toByteArray()); ftpClient.storeFile(localFile.getName(), byteIn); if (in != null) { in.close(); } if (byteIn != null) { byteIn.close(); } } ftpClient.logout(); return true; } catch (Exception e) { logger.error("error:", e); } finally { if (in != null) { try { in.close(); } catch (Exception e) { logger.error("FileInputStream关闭失败:", e); } } if (byteIn != null) { try { byteIn.close(); } catch (Exception e) { logger.error("FileInputStream关闭失败:", e); } } if (ftpClient != null && ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException e) { logger.error("FTP连接关闭失败:", e); } } } return false; } /** * 判断某文件是否存在 * @param ftpFileName * @return */ public boolean ifFilePresent(String ftpFileName) { boolean exist = false; FTPClient ftpClient = null; InputStream in = null; try { ftpClient = connectFTPClient(); if (ftpClient == null) { return false; } if (!ftpClient.changeWorkingDirectory(downloadPath)) { logger.error("FTP目录切换失败"); return false; } logger.info("FTP下载路径{},文件{}", downloadPath, ftpFileName); // 判断FTP上文件是否存在 in = ftpClient.retrieveFileStream(ftpFileName); if (in == null || ftpClient.getReplyCode() == FTPReply.FILE_UNAVAILABLE) { logger.error("FTP服务器上文件 " + downloadPath + ftpFileName + "不存在!"); return false; } ftpClient.completePendingCommand(); exist = true; } catch (Exception e) { logger.error("判断FTP上文件是否存出错:", e); } finally { if (in != null) { try { in.close(); } catch (IOException e) { logger.error("FileInputStream关闭失败:", e); } } if (ftpClient != null && ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException e) { logger.error("FTP连接关闭失败:", e); } } } return exist; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDownloadPath() { return downloadPath; } public void setDownloadPath(String downloadPath) { this.downloadPath = downloadPath; } public String getUploadPath() { return uploadPath; } public void setUploadPath(String uploadPath) { this.uploadPath = uploadPath; } }
ftp 上传和下载的工具类
猜你喜欢
转载自blog.csdn.net/u012045045/article/details/80107653
今日推荐
周排行