需要在前端展示ftp服务器中的目录结构,实现用户对ftp目录实时查询和其他文件操作。
采用递归方式,用户传入目录,递归查询,按层级结构封装,返回给前端,前端按层级展示给用户。
依赖apache的commons-net3.6提供的ftp功能。
下列代码可以直接当作一个spring-boot controller使用。
package com.projects.se1080.qrcode_auth.controller;import io.swagger.annotations.ApiOperation;import lombok.Data;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPFile;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Configuration;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;import java.io.IOException;import java.util.ArrayList;import java.util.List;/** * @author:Yjx * @description: * @date:2019/6/28 19:46 */@RestController@RequestMapping("/ftp")public class RecursionFtp { @Resource private FtpConfig ftpConfig; @ApiOperation("递归列出FTP目录下的内容(包括文件和目录)") @PostMapping("/recursionDir") public MyTree recursionDir(@RequestBody ListDirDTO dto) throws Exception { FTPClient ftp = this.initFtpClient(); if (ftp.getReplyCode() > 0) { String directory = dto.getDirectory(); ftp.changeWorkingDirectory(directory); FTPFile[] ftpFiles = ftp.listFiles(); MyTree root = new MyTree(directory); if (ftpFiles.length > 0) { this.recursion(ftpFiles, ftp, root); } this.destroyFtpClient(ftp); return root; } else { return null; } } private MyTree recursion(FTPFile[] fileArr, FTPClient ftp, MyTree myTree) throws Exception { if (fileArr.length > 0) { for (FTPFile it : fileArr) { if (it.isDirectory()) { ftp.changeWorkingDirectory(new String(it.getName().getBytes("utf-8"), "iso-8859-1")); FTPFile[] ftpFiles = ftp.listFiles(); if (ftpFiles.length > 0) { myTree.getChildren().add(this.recursion(ftpFiles, ftp, new MyTree(it.getName()))); } else { myTree.getChildren().add(new MyTree(it.getName())); ftp.changeToParentDirectory(); // 空目录务必要返回上一级 } } else { myTree.getChildren().add(new MyTree(it.getName())); } } } ftp.changeToParentDirectory(); return myTree; } /** * 初始化ftpClient * * @return * @throws IOException */ private FTPClient initFtpClient() throws IOException { FTPClient ftp = new FTPClient(); ftp.connect(this.ftpConfig.getIp(), this.ftpConfig.getPort()); ftp.login(this.ftpConfig.getUsername(), this.ftpConfig.getPassword()); ftp.setBufferSize(this.ftpConfig.getBufferSize()); ftp.setFileType(FTPClient.BINARY_FILE_TYPE); ftp.changeWorkingDirectory(this.ftpConfig.getBaseDir()); //对于某些ftp认证模式,需要配置用户的ftp根目录 return ftp; } /** * 销毁ftpClient * * @param ftpClient * @throws IOException */ private void destroyFtpClient(FTPClient ftpClient) throws IOException { ftpClient.logout(); ftpClient.disconnect(); }}/** * ftp服务器相关配置 */@Data@Configuration@ConfigurationProperties(prefix = "ftp")class FtpConfig { private String ip = "192.168.1.10"; private int port = 21; private String username = "myFtp"; private String password = "xxxxxx"; private String baseDir = "/"; private int bufferSize = 1024 * 1024 * 4;}@Dataclass MyTree { private String name; private List<MyTree> children; public MyTree() { } public MyTree(String name) { this.name = name; this.children = new ArrayList<>(); } public MyTree(String name, List<MyTree> children) { this.name = name; this.children = children; }}
学习使我充实,分享给我快乐!
语言方法
81386dAi9
i0ik7
抖音0播放怎么回事「解决方式」分享93922012/05/04 12:47:17
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。