思路:
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;
}
}
}
部分参考自:跳转链接