阿里云OSS获取文件目录树形结构返回el-tree目录结构数据(Java版)

思路:
1、先生成所有到最深目录的文件列表
2、根据文具列表递归生成树形结构

在这里插入图片描述

package com.liugx.report;

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.ObjectListing;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 阿里云oss
 *
 * @author liugx
 * @version 1.0
 * @date 2021/12/21 12:58
 */
@RestController
public class AliyunOSS {

    @Autowired
    private OSSConfig ossConfig;

    @Autowired
    private OSS ossClient;

    @RequestMapping("/list")
    public List<Folder> yyds(){
        List<String> res = new ArrayList<>();
        // 生成所有文件目录
        createOssFileList("",res);
        // 根据文件目录列表生成树形结构
        List<Folder> folders = formatFoldersTree(res);
        return folders;
    }
    /**
     * 生成文件列表
     * @param res 文件列表结果封装
     * @param commonPrefix 前缀
     * @return
     */
    public void createOssFileList(String commonPrefix, List<String> res) {
        //是否为最深的目录,递归返回跳出循环后设置为false
        boolean flag = true;
        // 构造ListObjectsRequest请求。
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(ossConfig.getBucket());
        // 设置正斜线(/)为文件夹的分隔符。
        listObjectsRequest.setDelimiter("/");
        // 列出主目录下的所有文件夹。
        listObjectsRequest.setPrefix(commonPrefix);
        ObjectListing listing = ossClient.listObjects(listObjectsRequest);
        int len = listing.getCommonPrefixes().size();
        if (len > 0){
            for (String Prefix : listing.getCommonPrefixes()){
                System.out.println(Prefix);
                createOssFileList(Prefix, res);
            }
            flag = false;
        }
        if (flag){
            res.add(commonPrefix);
        }
    }

    /**
     * 生成文件树形结构
     * @param list  文件列表
     * @return
     */
    static List<Folder> formatFoldersTree(List<String> list ){
        //结果集
        List<Folder> folders = new ArrayList<>();
        //文件列表集合
        List<List<String>> namesList = new ArrayList<>(50);
        for (String s : list) {
            List<String> names = Arrays.asList(s.split("/"));
            namesList.add(names);
        }
        //文件顶级目录
        Set<String> topFolderName = new TreeSet<>();
        for (List<String> strings : namesList) {
            topFolderName.add(strings.get(0));
        }
        //根据文件顶级目录生成
        for (String name : topFolderName) {
            Folder topFolder = buildFolder(name);
            LinkedHashMap<String, List<List<String>>> brandMap = namesList.stream().collect(Collectors.groupingBy(a -> a.get(0), LinkedHashMap::new, Collectors.toList()));
            List<List<String>> subFolders = brandMap.get(topFolder.getName()).stream().filter(a -> a.size() > 1).collect(Collectors.toList());
            System.out.println(brandMap);
            if (subFolders.size() > 0) {
                folders.add(link(topFolder, subFolders));
            } else {
                folders.add(topFolder);
            }
        }
        return folders;
    }
    //从某目录下去生成树形结构目录
    static Folder link(Folder folder, List<List<String>> sublists) {
        List<Folder> folders = new ArrayList<>();
        List<List<String>> subliststemp = new ArrayList<>();
        for (List<String> subList : sublists) {
            subList = subList.subList(1, subList.size());
            subliststemp.add(subList);
        }
        LinkedHashMap<String, List<List<String>>> brandMap = subliststemp.stream().collect(Collectors.groupingBy(a -> a.get(0), LinkedHashMap::new, Collectors.toList()));
        System.out.println(brandMap);

        for (String folderName : brandMap.keySet()) {
            System.out.println("新建父层级文件夹: " + folderName);
            Folder current = buildFolder(folderName);
            List<List<String>> subFolders = brandMap.get(folderName).stream().filter(a -> a.size() > 1).collect(Collectors.toList());
            System.out.println(brandMap);
            if (subFolders.size() > 0) {
                link(current, subFolders);
            }
            folders.add(current);
        }
        folder.setChildren(folders);
        return folder;
    }

    /**
     * 生成文件夹实体
     * @param name
     * @return
     */
    static Folder buildFolder(String name) {
        Folder folder = new Folder();
        folder.setName(name);
        folder.setChildren(new ArrayList<>());
        return folder;
    }
    /**
     * 文件夹目录实体类
     * @return
     */
    static class Folder{
        String name;
        @JsonInclude(JsonInclude.Include.NON_EMPTY)
        List<Folder> children;
        public List getChildren() {
            return children;
        }
        public void setChildren(List children) {
            this.children = children;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
}

部分参考自:跳转链接

你可以使用阿里云OSS的ListObjects接口来获取指定目录下的所有文件。具体步骤如下: 1. 创建OSSClient实例,连接到阿里云OSS服务。 2. 调用ListObjects接口,指定Bucket名称和目录路径。 3. 遍历返回OSSObjectSummary列表,获取每个文件的信息。 下面是Java代码示例: ```java import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.ListObjectsRequest; import com.aliyun.oss.model.ObjectListing; import com.aliyun.oss.model.OSSObjectSummary; public class ListObjectsSample { public static void main(String[] args) { String endpoint = "yourEndpoint"; String accessKeyId = "yourAccessKeyId"; String accessKeySecret = "yourAccessKeySecret"; String bucketName = "yourBucketName"; String prefix = "yourDirectoryPath"; // 目录路径,以“/”结尾 // 创建OSSClient实例 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 构造ListObjectsRequest请求 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); listObjectsRequest.setPrefix(prefix); // 调用ListObjects接口,获取指定目录下的所有文件 ObjectListing objectListing = ossClient.listObjects(listObjectsRequest); while (true) { // 遍历返回OSSObjectSummary列表 for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) { System.out.println(objectSummary.getKey()); } if (!objectListing.isTruncated()) { break; } // 如果返回的结果被截断,继续调用ListObjects接口获取剩余的文件 objectListing = ossClient.listNextBatchOfObjects(objectListing); } // 关闭OSSClient实例 ossClient.shutdown(); } } ``` 其中,`endpoint`、`accessKeyId`、`accessKeySecret`和`bucketName`需要替换为你自己的阿里云OSS账号信息,`prefix`需要指定你要获取目录路径。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值