/** * 获取ftp文件列表 * ".*\\.txt" :匹配所有以".txt" 结尾的文件名。其中,星号(*)表示任意字符序列,反斜杠(\)用于转义点号(.)字符。 * ".*" + "任意字符" + ".*\\.txt" :匹配所有包含 "表示匹配任意多个任意字符"和以".txt" 结尾的文件名。其中,星号(*)表示任意字符序列,反斜杠(\)用于转义点号(.)字符。 * @param params * @return */ @PostMapping("/getFTPFileList") @ResponseBody public Result getFTPFileList(@RequestBody Map<String,Object> params) { FTPClient ftpClient = new FTPClient(); List<Map<String, Object>> list = new ArrayList<>(); FTPFile[] page = new FTPFile[0]; int pageNum = ("".equals(String.valueOf(params.get("pageNo"))) || params.get("pageNo") == null) ? 1 : Integer.valueOf(String.valueOf(params.get("pageNo"))); int pageSize = ("".equals(String.valueOf(params.get("pageSize"))) || params.get("pageSize") == null) ? 20 : Integer.valueOf(String.valueOf(params.get("pageSize"))); int start = (pageNum - 1) * pageSize; int end = start + pageSize - 1; try { System.out.println("开始连接ftp"); ftpClient.connect(host, port); ftpClient.login(username, password); //测试 // ftpClient.connect(ip, pr); // ftpClient.login(user, pass); int reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); return Result.error("ftp连接失败:" + reply); }else{ System.out.println("ftp连接成功:" + reply); } ftpClient.enterLocalPassiveMode(); //被动模式 String p = ("".equals(String.valueOf(params.get("path"))) || params.get("path") == null) ? path : String.valueOf(params.get("path")); String f = ("".equals(String.valueOf(params.get("file"))) || params.get("file") == null) ? file : ".*" + params.get("file") + ".*"; System.out.println("正则匹配:" + f); //查询ftp服务器所有文件 FTPFile[] files = ftpClient.listFiles(p); //正则匹配文件名 Pattern filePattern = Pattern.compile(f); if (files == null || files.length < start) { return Result.success(new FTPFile[0]); } //创建新文件数组 FTPFile[] newFtpFile = new FTPFile[files.length]; //新数组下标 int index = 0; //遍历数据验证是否符合查询条件,将符合条件的数据copy到新文件数组 for (FTPFile file : files) { if (file.isFile() && filePattern.matcher(file.getName()).matches()) { //符合条件存入且下标+1 newFtpFile[index++] = file; } } int count = Math.min(end + 1, files.length) - start; page = new FTPFile[count]; //对新数组元素进行分页 System.arraycopy(newFtpFile, start, page, 0, count); for (FTPFile file : page) { if (file != null && file.isFile() && filePattern.matcher(file.getName()).matches()) { Map<String, Object> map = new HashMap<>(); map.put("name", file.getName()); //计算大小MB double megabytes = (double) file.getSize() / 1048576; if (megabytes >= 1024) { //计算大小G megabytes = megabytes / 1024; String formattedNumber = String.format("%.1f", megabytes); map.put("size", formattedNumber + "G"); } else { String formattedNumber = String.format("%.1f", megabytes); map.put("size", formattedNumber + "MB"); } list.add(map); } } } catch (IOException e) { throw new RuntimeException(e); } finally { try { ftpClient.logout(); ftpClient.disconnect(); System.out.println("已关闭ftp链接"); } catch (IOException e) { throw new RuntimeException(e); } } return Result.success(list); }
测试结果:
入参:path 是文件存储路径, file 是文件名称,支持模糊查询
{ "path":"/visit", "file":"202305", "pageNum": 1, "pageSize": 20 }
记录一下平常遇到的问题及新的知识,方便以后查看