JavaFTP递归查询指定目录下的所有目录和文件

2021-05-02 04:29

阅读:725

标签:byte   java   contex   ack   post   frame   mapping   param   pack   

  1. 需要在前端展示ftp服务器中的目录结构,实现用户对ftp目录实时查询和其他文件操作。
  2. 采用递归方式,用户传入目录,递归查询,按层级结构封装,返回给前端,前端按层级展示给用户。
  3. 依赖apache的commons-net3.6提供的ftp功能。
  4. 下列代码可以直接当作一个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()));
                    }
                } 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);
        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;

    private int port;

    private String username;

    private String password;

    private String baseDir;

    private int bufferSize = 1024 * 1024 * 4;

}

@Data
class MyTree {

    private String name;

    private List children;

    public MyTree() {
    }

    public MyTree(String name) {
        this.name = name;
        this.children = new ArrayList();
    }

    public MyTree(String name, List children) {
        this.name = name;
        this.children = children;
    }
}


JavaFTP递归查询指定目录下的所有目录和文件

标签:byte   java   contex   ack   post   frame   mapping   param   pack   

原文地址:https://www.cnblogs.com/JaxYoun/p/13204753.html


评论


亲,登录后才可以留言!