话不多说,直接上代码
pom依赖
<!-- FTP支持 --> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6</version> </dependency>
配置类config
package cn.lsr.core.ftp.config; /** * @Description: ftp 配置类 * @Package: lsr-microservice * @author: Hacker_lsr@126.com **/ public class FtpConfig { /** * ftp服务器地址 */ public String hostname; /** * ftp服务器端口号默认为21 */ public Integer port = 21 ; /** * ftp登录账号 */ public String username ; /** * ftp登录密码 */ public String password ; //get set }
注入bean基于springboot
package cn.lsr.core.config.bean; import cn.lsr.core.ftp.config.FtpConfig; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Description: bean配置 * @Package: lsr-microservice * @author: Hacker_lsr@126.com **/ @Configuration public class BeanConfigManager { @Bean @ConfigurationProperties(prefix = "lsr.ftp",ignoreInvalidFields = true) @ConditionalOnProperty(prefix = "lsr.ftp",name = "enabled",havingValue = "true") public FtpConfig initFtpConfig(){ return new FtpConfig(); } }
对应的application.properties
lsr.ftp.enabled=true lsr.ftp.hostname=xxx
lsr.ftp.port=21
lsr.ftp.username=xxx
lsr.ftp.password=xxx
工具类 FtpUtils
package cn.lsr.core.ftp; import cn.lsr.core.ftp.config.FtpConfig; import cn.lsr.core.util.SpringUtil; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; import java.net.MalformedURLException; /** * @Description: ftp上传下载工具类 * @Package: lsr-microservice * @author: Hacker_lsr@126.com **/ public class FtpUtils { private static final Logger LOGGER = LoggerFactory.getLogger(FtpUtils.class); /** * ftp 配置 */ private FtpConfig ftpConfig = SpringUtil.getBean(FtpConfig.class); public FTPClient ftpClient = null; /** * 初始化ftp服务器 */ public void initFtpClient() { ftpClient = new FTPClient(); ftpClient.setControlEncoding("utf-8"); try { LOGGER.info("初始化ftp服务器:"+ftpConfig.hostname+":"+ftpConfig.port); ftpClient.connect(ftpConfig.hostname, ftpConfig.port); //连接ftp服务器 ftpClient.login(ftpConfig.username, ftpConfig.password); //登录ftp服务器 ftpClient.enterLocalPassiveMode(); int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器 if(!FTPReply.isPositiveCompletion(replyCode)){ LOGGER.info("登录ftp服务器:error -->:"+ftpConfig.hostname+":"+ftpConfig.port); } LOGGER.info("登录ftp服务器:success -->:"+ftpConfig.hostname+":"+ftpConfig.port); }catch (MalformedURLException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } } /** * 上传文件 * @param pathname ftp服务保存地址 * @param fileName 上传到ftp的文件名 * @param originfilename 待上传文件的名称(绝对地址) * * @return */ public boolean uploadFile( String pathname, String fileName,String originfilename){ InputStream inputStream = null; try{ LOGGER.info("================开始上传文件================"); inputStream = new FileInputStream(new File(originfilename)); initFtpClient(); ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE); CreateDirecroty(pathname); ftpClient.makeDirectory(pathname); ftpClient.changeWorkingDirectory(pathname); ftpClient.storeFile(fileName, inputStream); inputStream.close(); ftpClient.logout(); LOGGER.info("================上传文件成功================"); }catch (Exception e) { LOGGER.info("================上传文件失败!!================"); e.printStackTrace(); }finally{ if(ftpClient.isConnected()){ try{ ftpClient.disconnect(); }catch(IOException e){ e.printStackTrace(); } } if(null != inputStream){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return true; } /** * 上传文件 * @param pathname ftp服务保存地址 * @param fileName 上传到ftp的文件名 * @param inputStream 输入文件流 * @return */ public boolean uploadFile( String pathname, String fileName,InputStream inputStream){ try{ LOGGER.info("================开始上传文件================"); initFtpClient(); ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE); CreateDirecroty(pathname); ftpClient.makeDirectory(pathname); ftpClient.changeWorkingDirectory(pathname); ftpClient.storeFile(fileName, inputStream); inputStream.close(); ftpClient.logout(); LOGGER.info("================上传文件成功================"); }catch (Exception e) { LOGGER.info("================上传文件失败!!================"); e.printStackTrace(); }finally{ if(ftpClient.isConnected()){ try{ ftpClient.disconnect(); }catch(IOException e){ e.printStackTrace(); } } if(null != inputStream){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return true; } //改变目录路径 public boolean changeWorkingDirectory(String directory) { boolean flag = true; try { flag = ftpClient.changeWorkingDirectory(directory); if (flag) { LOGGER.info("进入文件夹" + directory + " 成功!"); } else { LOGGER.info("进入文件夹" + directory + " 失败!开始创建文件夹"); } } catch (IOException ioe) { ioe.printStackTrace(); } return flag; } //创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建 public boolean CreateDirecroty(String remote) throws IOException { boolean success = true; String directory = remote + "/"; // 如果远程目录不存在,则递归创建远程服务器目录 if (!directory.equalsIgnoreCase("/") && !changeWorkingDirectory(new String(directory))) { int start = 0; int end = 0; if (directory.startsWith("/")) { start = 1; } else { start = 0; } end = directory.indexOf("/", start); String path = ""; String paths = ""; while (true) { String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1"); path = path + "/" + subDirectory; if (!existFile(path)) { if (makeDirectory(subDirectory)) { changeWorkingDirectory(subDirectory); } else { System.out.println("创建目录[" + subDirectory + "]失败"); changeWorkingDirectory(subDirectory); } } else { changeWorkingDirectory(subDirectory); } paths = paths + "/" + subDirectory; start = end + 1; end = directory.indexOf("/", start); // 检查所有目录是否创建完毕 if (end <= start) { break; } } } return success; } //判断ftp服务器文件是否存在 public boolean existFile(String path) throws IOException { boolean flag = false; FTPFile[] ftpFileArr = ftpClient.listFiles(path); if (ftpFileArr.length > 0) { flag = true; } return flag; } //创建目录 public boolean makeDirectory(String dir) { boolean flag = true; try { flag = ftpClient.makeDirectory(dir); if (flag) { System.out.println("创建文件夹" + dir + " 成功!"); } else { System.out.println("创建文件夹" + dir + " 失败!"); } } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 下载文件 * * @param pathname FTP服务器文件目录 * * @param filename 文件名称 * * @param localpath 下载后的文件路径 * * @return */ public boolean downloadFile(String pathname, String filename, String localpath){ boolean flag = false; OutputStream os=null; try { System.out.println("开始下载文件"); initFtpClient(); //切换FTP目录 ftpClient.changeWorkingDirectory(pathname); FTPFile[] ftpFiles = ftpClient.listFiles(); for(FTPFile file : ftpFiles){ if(filename.equalsIgnoreCase(file.getName())){ File localFile = new File(localpath + "/" + file.getName()); os = new FileOutputStream(localFile); ftpClient.retrieveFile(file.getName(), os); os.close(); } } ftpClient.logout(); flag = true; System.out.println("下载文件成功"); } catch (Exception e) { System.out.println("下载文件失败"); e.printStackTrace(); } finally{ if(ftpClient.isConnected()){ try{ ftpClient.disconnect(); }catch(IOException e){ e.printStackTrace(); } } if(null != os){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } return flag; } /** * 删除文件 * * @param pathname FTP服务器保存目录 * * @param filename 要删除的文件名称 * * @return */ public boolean deleteFile(String pathname, String filename){ FTPClient ftpClient = null; boolean flag = false; try { LOGGER.info("开始删除文件{}",filename); //切换FTP目录 ftpClient.changeWorkingDirectory(pathname); ftpClient.dele(filename); ftpClient.logout(); flag = true; LOGGER.info("删除文件{}成功。",filename); } catch (Exception e) { flag=false; LOGGER.info("删除文件{}失败!!。",filename); e.printStackTrace(); } finally { if(ftpClient.isConnected()){ try{ ftpClient.disconnect(); }catch(IOException e){ e.printStackTrace(); } } } return flag; } public static void main(String[] args) { FtpUtils ftp =new FtpUtils(); ftp.uploadFile("/opt/ftp", "txc.sql", "/Users/lsr/Desktop/txc.sql"); //ftp.downloadFile("/opt/ftp", "txc.sql", "/Users/lsr/"); //ftp.deleteFile("/opt/ftp", "txc.sql"); System.out.println("ok"); } }
end