精品熟女碰碰人人a久久,多姿,欧美欧美a v日韩中文字幕,日本福利片秋霞国产午夜,欧美成人禁片在线观看

ztree+ajax實(shí)現(xiàn)文件樹下載功能

基于java實(shí)現(xiàn)文件樹下載,供大家參考,具體內(nèi)容如下

0.項(xiàng)目準(zhǔn)備工作

1.前端用到的插件庫:

ztree官網(wǎng)

2.后端maven依賴:

<dependencies>
  <!-- servlet依賴 -->
  <dependency>
    <groupid>javax.servlet</groupid>
    <artifactid>javax.servlet-api</artifactid>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>

  <!-- springmvc依賴 -->
  <dependency>
    <groupid>org.springframework</groupid>
    <artifactid>spring-webmvc</artifactid>
    <version>5.2.6.release</version>
  </dependency>

  <!-- 文件上傳的jar包 -->
  <dependency>
    <groupid>commons-io</groupid>
    <artifactid>commons-io</artifactid>
    <version>2.8.0</version>
  </dependency>
  <dependency>
    <groupid>commons-fileupload</groupid>
    <artifactid>commons-fileupload</artifactid>
    <version>1.3.3</version>
  </dependency>
     // gson可以不要,這是我測試時(shí)使用的
    <dependency>
      <groupid>com.google.code.gson</groupid>
      <artifactid>gson</artifactid>
      <version>2.2.4</version>
    </dependency>

</dependencies>

3.web.xml配置

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
         xsi:schemalocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
  <!-- 聲明springmvc的核心對象 dispatcherservlet -->
  <servlet>
    <servlet-name>web</servlet-name>
    <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>
    <init-param>
      <param-name>contextconfiglocation</param-name>
      <param-value>classpath:springconfig.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>web</servlet-name>
    <url-pattern>*.mvc</url-pattern>
  </servlet-mapping>

  <!--  注冊字符集過濾器,解決post請求的中文亂碼問題-->
  <filter>
    <filter-name>characterencodingfilter</filter-name>
    <filter-class>org.springframework.web.filter.characterencodingfilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
    <init-param>
      <param-name>forrequestencoding</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>forresponseencoding</param-name>
      <param-value>true</param-value>
    </init-param>

  </filter>
  <filter-mapping>
    <filter-name>characterencodingfilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

4.springconfig.xml配置

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemalocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!-- 開啟組件掃描   -->
    <context:component-scan base-package="com.file"></context:component-scan>

    <!--聲明 配置springmvc視圖解析器-->
    <bean  class="org.springframework.web.servlet.view.internalresourceviewresolver">
        <!--前綴:視圖文件的路徑-->
        <property name="prefix" value="/web-inf/view/" />
        <!--后綴:視圖文件的擴(kuò)展名-->
        <property name="suffix" value=".jsp" />
    </bean>

    <!--讀寫json的支持(jackson)-->
    <mvc:annotation-driven />

    <!--  配置多媒體解析  -->
    <bean id="multipartresolver" class="org.springframework.web.multipart.commons.commonsmultipartresolver">
        <!--  配置字符編碼集 -->
        <property name="defaultencoding" value="utf-8"> </property>
        <!-- 配置文件上傳大小 單位是字節(jié)    -1代表沒有限制 maxuploadsizeperfile是限制每個(gè)上傳文件的大小,而maxuploadsize是限制總的上傳文件大小  -->
        <property name="maxuploadsizeperfile" value="-1"> </property>

        <!-- ,不設(shè)置默認(rèn)不限制總的上傳文件大小,這里設(shè)置總的上傳文件大小不超過1m(1*1024*1024) -->
        <property name="maxuploadsize" value="1048576"/>

    </bean>

</beans>

1.效果展示:

服務(wù)器端的文件目錄:

2.思路分析

1、需要遞歸遍歷某個(gè)目錄,并且判斷是目錄還是文件
2、找到父目錄和子文件的關(guān)系,構(gòu)建文件對象,將該對象加入到list集合中
3、將list集合轉(zhuǎn)為json,返回給前端進(jìn)行渲染
4、前端渲染出來的每個(gè)文件都包含一個(gè)該文件對應(yīng)的下載url,點(diǎn)擊該文件跳轉(zhuǎn)到該文件的下載接口
5、提供下載接口,前端需要傳遞一個(gè)文件名稱,然后后端根據(jù)文件名稱去遍歷指定的目錄,查詢是否有該文件,如果有,則將該文件進(jìn)行下載

先來看下如果遞歸遍歷獲取到某個(gè)目錄下的所有文件:

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()){
            // 獲取當(dāng)前文件夾下的所有子文件
            file[] files = file.listfiles();
            if (files!=null&&files.length>0){
                // 對該文件夾進(jìn)行遍歷
                for (int i = 0; i < files.length; i++) {
                    //  // 如果是一個(gè)目錄繼續(xù)進(jìn)行遞歸
                    if (files[i].exists()&&files[i].isdirectory()){
                        listfile(files[i]);
                    }else {
                        // 不是目錄,是一個(gè)文件,則輸出文件名
                          system.out.println(files[i].getname());
                    }
                }
            }
        }

    }
    
}

3.前端實(shí)現(xiàn)代碼:

代碼:

<%@ 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 rel="stylesheet" href="../../css/ztreestyle/ztreestyle.css" rel="external nofollow" type="text/css">
  <script type="text/javascript" src="../../js/jquery-1.4.4.min.js"></script>
  <script type="text/javascript" src="../../js/jquery.ztree.core.min.js"></script>


  <title>文件下載</title>
</head>
<body>


<script>
  var settingss = {
    //ztree 的唯一標(biāo)識,初始化后,等于 用戶定義的 ztree 容器的 id 屬性值。
    treeid:"treedemo",
    data: {
      simpledata: {
        enable: true,  //true 、 false 分別表示 使用 、 不使用 簡單數(shù)據(jù)模式
        idkey: "id",   //節(jié)點(diǎn)數(shù)據(jù)中保存唯一標(biāo)識的屬性名稱
        pidkey: "pid",    //節(jié)點(diǎn)數(shù)據(jù)中保存其父節(jié)點(diǎn)唯一標(biāo)識的屬性名稱
        rootpid: "0"  //用于修正根節(jié)點(diǎn)父節(jié)點(diǎn)數(shù)據(jù),即 pidkey 指定的屬性值
      },
      key: {
        name: "name"  //ztree 節(jié)點(diǎn)數(shù)據(jù)保存節(jié)點(diǎn)名稱的屬性名稱  默認(rèn)值:"name"
      }
    },
    check:{
      enable:true,  //true 、 false 分別表示 顯示 、不顯示 復(fù)選框或單選框
      nocheckinherit:false,   //當(dāng)父節(jié)點(diǎn)設(shè)置 nocheck = true 時(shí),設(shè)置子節(jié)點(diǎn)是否自動(dòng)繼承 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返回的數(shù)據(jù) 并且初始化文件樹
       var ztreeobj = $.fn.ztree.init($("#treedemo"), settingss, result); //初始化樹
        ztreeobj.expandall(false);   //true 節(jié)點(diǎn)全部展開、false節(jié)點(diǎn)收縮

      }
    });
  });


</script>
<div>
  <ul id="treedemo" class="ztree"></ul>
</div>
</body>
</html>

4.后端代碼實(shí)現(xiàn):

1.抽象出來的實(shí)例對象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 +
                ", name='" + name + '\'' +
                ", 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.渲染數(shù)據(jù)和指定文件名查詢文件地址的類

/**
 * @author compass
 * @version 1.0
 * @date 2021-05-15 12:31
 */
public class filerservice {

    // 將構(gòu)建為文件對象的文件或目錄放到list集合中
    list<myfile> filelist = new arraylist<>();

    /**
     * 功能:遞歸遍歷文件,并且將文件或目錄按照規(guī)定構(gòu)建為對象 撞到list集合返回
     * @param file 待遍歷的文件夾
     * @param index 掃描文件賦值指針 初始值為 :1
     * @return
     */
    public  list<myfile> listall1(file file , int index) {

        file[] listfiles=  file.listfiles();

        // 將文件或目錄構(gòu)建為對象
        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()){
            // 獲取當(dāng)前文件夾下的所有子文件
            file[] files = file.listfiles();
            if (files!=null&&files.length>0){
                // 對文件進(jìn)行遍歷
                for (int i = 0; i < files.length; i++) {
                    if (files[i].exists()&&files[i].isdirectory()){
                        // 如果是一個(gè)目錄繼續(xù)進(jìn)行遞歸 直到找到文件為止 每遍歷一個(gè)目錄 index+1
                        listall1(files[i],i+1);
                    }
                }
            }
        }
        return filelist;
    }

    // 制定文件的父目錄
    string parentdir=null;

    /**
     * 根據(jù)傳遞過來的文件名 找到該文件的父文件夾,如果沒有找到返回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.下載和渲染數(shù)據(jù)的controller

/**
 * @author compass
 * @version 1.0
 * @date 2021-05-14 21:43
 */
@controller
@requestmapping("/file/")
public class filedownloadcontroller {


    // 提供訪問接口
    @getmapping("downloadin.mvc")
    public string downloadin(){
        return "index";
    }

    // 初始化頁面數(shù)據(jù)
    @responsebody
    @getmapping("init.mvc")
    public list<myfile> test(){
        file file = new file("d:\\ide2019\\work");
        filerservice service = new filerservice();
        // 將制定目錄的文件夾 下的目錄和文件構(gòu)建為myfile對象裝到list集合中
        list<myfile> listall1 = service.listall1(file, 1);
        // 返回json數(shù)據(jù)給前端進(jìn)行渲染
        return listall1;
    }

    // 提供下載接口
    @getmapping("download.mvc")
    public responseentity <byte[]> filedownload1(string filename,httpservletrequest request) throws ioexception {
        // 指定下載那個(gè)目錄下的文件
        file file = new file("d:\\ide2019\\work");
        filerservice service = new filerservice();
        // 獲取到該文件的父目錄
        string path = service.getfilename(filename, file);

        // 創(chuàng)建文件下載對象
        file downloadfile = new file(path, filename);

        httpheaders header = new httpheaders();
        header.setcontentdispositionformdata("attachment",filename);
        header.setcontenttype(mediatype.application_octet_stream);
        responseentity<byte[]> result = new responseentity<>(fileutils.readfiletobytearray(downloadfile), header, httpstatus.ok);
        return result;
    }
}

測試:可以看到我們每點(diǎn)擊一個(gè)文件都可以跳轉(zhuǎn)到我們的下載接口,進(jìn)行下載的。

這只是一個(gè)簡單的使用,還有很多地方需要進(jìn)行優(yōu)化,當(dāng)然也可以使用別的方法進(jìn)行實(shí)現(xiàn),這就是算是一個(gè)小練習(xí)吧,復(fù)習(xí)一下ajax和遞歸的知識。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持碩編程。

相關(guān)文章