ztree+ajax实现文件树下载功能(2)

1、需要递归遍历某个目录,并且判断是目录还是文件
2、找到父目录和子文件的关系,构建文件对象,将该对象加入到list集合中
3、将list集合转为json,返回给前端进行渲染
4、前端渲染出来的每个文件都包含一个该文件对应的下载url,点击该文件跳转到该文件的下载接口
5、提供下载接口,前端需要传递一个文件名称,然后后端根据文件名称去遍历指定的目录,查询是否有该文件,如果有,则将该文件进行下载

先来看下如果递归遍历获取到某个目录下的所有文件:

public class Test2 { public static void main(String[] args) { File file = new File("D:\\IDE2019"); listFile(file); } public static void listFile(File file ) { // 判断该文件是否存在 if (file.exists()){ // 获取当前文件夹下的所有子文件 File[] files = file.listFiles(); if (files!=null&&files.length>0){ // 对该文件夹进行遍历 for (int i = 0; i < files.length; i++) { // // 如果是一个目录继续进行递归 if (files[i].exists()&&files[i].isDirectory()){ listFile(files[i]); }else { // 不是目录,是一个文件,则输出文件名 System.out.println(files[i].getName()); } } } } } }

3.前端实现代码:

代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link href="" type="text/css"> <script type="text/javascript" src=""></script> <script type="text/javascript" src=""></script> <title>文件下载</title> </head> <body> <script> var settingss = { //zTree 的唯一标识,初始化后,等于 用户定义的 zTree 容器的 id 属性值。 treeId:"treeDemo", data: { simpleData: { enable: true, //true 、 false 分别表示 使用 、 不使用 简单数据模式 idKey: "id", //节点数据中保存唯一标识的属性名称 pIdKey: "pId", //节点数据中保存其父节点唯一标识的属性名称 rootPId: "0" //用于修正根节点父节点数据,即 pIdKey 指定的属性值 }, key: { name: "name" //zTree 节点数据保存节点名称的属性名称 默认值:"name" } }, check:{ enable:true, //true 、 false 分别表示 显示 、不显示 复选框或单选框 nocheckInherit:false, //当父节点设置 nocheck = true 时,设置子节点是否自动继承 nocheck = true chkboxType: { "Y": "p", "N": "s" } }, }; $(document).ready(function(){ $.ajax({ type:"get", url:"/file/init.mvc", async:true, success:function(result){ console.log(result) // 得到ajax返回的数据 并且初始化文件树 var zTreeObj = $.fn.zTree.init($("#treeDemo"), settingss, result); //初始化树 zTreeObj.expandAll(false); //true 节点全部展开、false节点收缩 } }); }); </script> <div> <ul></ul> </div> </body> </html>

4.后端代码实现:

1.抽象出来的实例对象bean

/** * @author compass * @version 1.0 * @date 2021-05-14 22:41 */ public class MyFile { private int id; private int pId; private String name; private String url; public MyFile(int id, int pId, String name, String url) { this.id = id; this.pId = pId; this.name = name; this.url = url; } @Override public String toString() { return "MyFile{" + "id=" + id + ", pId=" + pId + ",\'' + ", url='" + url + '\'' + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getpId() { return pId; } public void setpId(int pId) { this.pId = pId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }

2.渲染数据和指定文件名查询文件地址的类

/** * @author compass * @version 1.0 * @date 2021-05-15 12:31 */ public class FilerService { // 将构建为文件对象的文件或目录放到list集合中 List<MyFile> fileList = new ArrayList<>(); /** * 功能:递归遍历文件,并且将文件或目录按照规定构建为对象 撞到List集合返回 * @param file 待遍历的文件夹 * @param index 扫描文件赋值指针 初始值为 :1 * @return */ public List<MyFile> listAll1(File file , int index) { File[] listFiles= file.listFiles(); // 将文件或目录构建为对象 for (int i=1;i<listFiles.length+1;i++){ if (listFiles[i-1].isDirectory()){ // 如果是目录 则url为空 pid=0说明是根目录 MyFile myFile = new MyFile(i,0,listFiles[i-1].getName(),""); fileList.add(myFile); }else { // 如果是文件则拼接下载地址 String filename=listFiles[i-1].getName(); // 文件的id为:(目录id*100)+文件序列 MyFile myFile = new MyFile((100*index)+i,index,listFiles[i-1].getName(),"http://localhost:8080/file/download.mvc?filename="+filename); fileList.add(myFile); } } // 判断该文件是否存在 if (file.exists()){ // 获取当前文件夹下的所有子文件 File[] files = file.listFiles(); if (files!=null&&files.length>0){ // 对文件进行遍历 for (int i = 0; i < files.length; i++) { if (files[i].exists()&&files[i].isDirectory()){ // 如果是一个目录继续进行递归 直到找到文件为止 每遍历一个目录 index+1 listAll1(files[i],i+1); } } } } return fileList; } // 制定文件的父目录 String parentDir=null; /** * 根据传递过来的文件名 找到该文件的父文件夹,如果没有找到返回null * @param fileName 文件名 * @param dir 需要查找的目录 * @return */ public String getFileName(String fileName,File dir){ if (dir.exists()){ File[] files = dir.listFiles(); if (files!=null&&files.length>0){ for (int i=0;i<files.length;i++){ if (files[i].exists()&&files[i].isDirectory()){ getFileName(fileName,files[i]); }else { // 如果找到传递过来的文件名则赋值给 parentDir if (fileName.equals(files[i].getName())){ parentDir=files[i].getParent(); break; } } } } } return parentDir; } }

3.下载和渲染数据的Controller

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygdwy.html