上次因为涉及到协议下载包的原因,将sftp服务器变更为ftp之后,我发现原本写的sftp连不上ftp。所以,就把sftp的工具类果断换成了ftp的工具类。下面我就直接贴代码,不废话了。
一:连接ftp服务器
/** * 获取FTPClient对象 * * @param ftpHost FTP主机服务器 * @param ftpPassword FTP 登录密码 * @param ftpUserName FTP登录用户名 * @param ftpPort FTP端口 默认为21 * @return */ public static FTPClient getFTPClient(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword) { FTPClient ftpClient = new FTPClient(); try { ftpClient = new FTPClient(); ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器 ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器 if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { System.out.println("未连接到FTP,用户名或密码错误。"); ftpClient.disconnect(); } else { System.out.println("FTP连接成功。"); } } catch (SocketException e) { e.printStackTrace(); System.out.println("FTP的IP地址可能错误,请正确配置。"); } catch (IOException e) { e.printStackTrace(); System.out.println("FTP的端口错误,请正确配置。"); } return ftpClient; }
二:上传下载文件工具类
/* * 从FTP服务器下载文件 * * @param ftpHost FTP IP地址 * @param ftpUserName FTP 用户名 * @param ftpPassword FTP用户名密码 * @param ftpPort FTP端口 * @param ftpPath FTP服务器中文件所在路径 格式: ftptest/aa * @param localPath 下载到本地的位置 格式:H:/download * @param fileName 文件名称 */ public static void downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String localPath, String fileName) { FTPClient ftpClient = null; try { ftpClient = getFTPClient(ftpHost,ftpPort, ftpUserName, ftpPassword); ftpClient.setControlEncoding("UTF-8"); // 中文支持 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); ftpClient.changeWorkingDirectory(ftpPath); File localFile = new File(localPath + File.separatorChar + fileName); OutputStream os = new FileOutputStream(localFile); ftpClient.retrieveFile(fileName, os); os.close(); ftpClient.logout(); } catch (FileNotFoundException e) { System.out.println("没有找到" + ftpPath + "文件"); e.printStackTrace(); } catch (SocketException e) { System.out.println("连接FTP失败."); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); System.out.println("文件读取错误。"); e.printStackTrace(); } }
/** * Description: 向FTP服务器上传文件 * @param ftpHost FTP服务器hostname * @param ftpUserName 账号 * @param ftpPassword 密码 * @param ftpPort 端口 * @param ftpPath FTP服务器中文件所在路径 格式: ftptest/aa * @param fileName ftp文件名称 * @param input 文件流 * @return 成功返回true,否则返回false */ public static boolean uploadFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath, String fileName,InputStream input) { boolean success = false; FTPClient ftpClient = null; try { int reply; ftpClient = getFTPClient(ftpHost,ftpPort, ftpUserName, ftpPassword); reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); return success; } ftpClient.setControlEncoding("UTF-8"); // 中文支持 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.enterLocalPassiveMode(); ftpClient.changeWorkingDirectory(ftpPath); ftpClient.storeFile(fileName, input); input.close(); ftpClient.logout(); success = true; } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { } } } return success; }
最主要的就是连接,上传和下载部分了,当然还有就是删除文件和断开与服务器的连接了,代码我也一一奉上了
//删除ftp文件 public static boolean deleteFile(String pathname, String filename,String ftpHost,int ftpPort,String ftpUserName,String ftpPassword) { boolean flag = false; FTPClient ftpClient = null; try { ftpClient = getFTPClient(ftpHost,ftpPort, ftpUserName, ftpPassword); System.out.println("开始删除文件"); //切换FTP目录 ftpClient.changeWorkingDirectory(pathname); ftpClient.dele(filename); 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(); } } } return flag; }
/** * 断开与远程服务器的连接 */ public static void closeClient(FTPClient ftpClient) { if (ftpClient != null && ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); } } }