zoukankan      html  css  js  c++  java
  • JavaFTP递归查询指定目录下的所有目录和文件

    1. 需要在前端展示ftp服务器中的目录结构,实现用户对ftp目录实时查询和其他文件操作。
    2. 采用递归方式,用户传入目录,递归查询,按层级结构封装,返回给前端,前端按层级展示给用户。
    3. 依赖apache的commons-net3.6提供的ftp功能。
    4. 下列代码可以直接当作一个spring-boot controller使用。
    5. 特别注意:递归式遍历目录,性能不高。我实践发现,在目录层级深、文件数量多时,遍历耗时特别长。故建议仅在目录深度和文件数量都有限(比如屈指可数)的场景下使用。
    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;
    
    }
    
    @Data
    class 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;
        }
    }
    
    
    
  • 相关阅读:
    WPF中ListBoxItem绑定一个UserControl的学习
    Server.Transfer和Response.Redirect的区别
    4个程序员的一天
    (转)让ADO.NET Entity Framework支持Oracle数据库
    IIS操作类
    HttpHandler与HttpModule区别
    网站性能优化的34条黄金法则
    oracle9i/10g/11g各种下载
    WCF简要介绍
    软件系统的稳定性
  • 原文地址:https://www.cnblogs.com/JaxYoun/p/13204753.html
Copyright © 2011-2022 走看看