SpringMVC 대용량 파일 업로드 및 다운로드 구현 기술 (100M 이상)

폴더 데이터베이스 처리 논리

공용 클래스 DbFolder

{

    JSONObject 루트;

   

    공용 DbFolder ()

    {

        this.root = new JSONObject ();

        this.root.put ( "f_id", "");

        this.root.put ( "f_nameLoc", "根 目录");

        this.root.put ( "f_pid", "");

        this.root.put ( "f_pidRoot", "");

    }

   

    / **

     * JSONArray를지도로 변환

     * @param 폴더

     * @return

     * /

    공용 Map <String, JSONObject> toDic (JSONArray 폴더)

    {

        Map <String, JSONObject> dt = new HashMap <String, JSONObject> ();

        for (int i = 0, l = folders.size (); i <l; ++ i)

        {

            JSONObject o = folders.getJSONObject (i);

            문자열 id = o.getString ( "f_id");

            dt.put (id, o);

        }

        반환 dt;

    }

   

    공용 Map <String, JSONObject> foldersToDic (String pidRoot)

    {

        // 기본적으로 루트 디렉토리로드

        String sql = String.format ( "select f_id, f_nameLoc, f_pid, f_pidRoot from up6_folders where f_pidRoot = '% s'", pidRoot);

 

        SqlExec se = 새로운 SqlExec ();

        JSONArray folders = se.exec ( "up6_folders", sql, "f_id, f_nameLoc, f_pid, f_pidRoot", "");

        return this.toDic (folders);

    }

   

    public ArrayList <JSONObject> sortByPid (Map <String, JSONObject> dt, String idCur, ArrayList <JSONObject> psort) {

 

        문자열 cur = idCur;

        while (true)

        {

            // 키가 없습니다.

            if (! dt.containsKey (cur)) break;

 

            JSONObject d = dt.get (cur); // 부모 ID 확인

            psort.add (0, d); // 부모 노드를 앞에 정렬           

            cur = d.getString ( "f_pid"). trim (); // 부모 ID 가져 오기

 

            if (cur.trim () == "0") break;

            if (StringUtils.isBlank (cur)) break;

        }

        반환 psort;

    }

   

 

    public JSONArray build_path_by_id (JSONObject fdCur) {

 

        문자열 id = fdCur.getString ( "f_id"). trim (); //

        문자열 pidRoot = fdCur.getString ( "f_pidRoot"). trim (); //

 

        //루트 디렉토리

        ArrayList <JSONObject> psort = new ArrayList <JSONObject> ();

        if (StringUtils.isBlank (id))

        {

            psort.add (0, this.root);

 

            return JSONArray.fromObject (psort);

        }

 

        // 디렉터리 매핑 테이블 (ID, 폴더) 작성

        Map <String, JSONObject> dt = this.foldersToDic (pidRoot);

 

        // 디렉토리를 계층 적 순서로 정렬

        psort = this.sortByPid (dt, id, psort);

 

        SqlExec se = 새로운 SqlExec ();

        // 하위 디렉토리-> 루트 디렉토리 추가

        if (! StringUtils.isBlank (pidRoot))

        {

            JSONObject root = se.read ( "up6_files"

                    , "f_id, f_nameLoc, f_pid, f_pidRoot"

                    , new SqlParam [] {new SqlParam ( "f_id", pidRoot)});

            psort.add (0, 루트);

        } //는 루트 디렉토리-> 루트 디렉토리 추가

        else if (! StringUtils.isBlank (id) && StringUtils.isBlank (pidRoot))

        {

            JSONObject root = se.read ( "up6_files"

                    , "f_id, f_nameLoc, f_pid, f_pidRoot"

                    , new SqlParam [] {new SqlParam ( "f_id", id)});

            psort.add (0, 루트);

        }

        psort.add (0, this.root);

 

        return JSONArray.fromObject (psort);

    }

   

    public FileInf read (String id) {

        SqlExec se = 새로운 SqlExec ();

        String sql = String.format ( "select f_pid, f_pidRoot, f_pathSvr from up6_files where f_id = '% s'union select f_pid, f_pidRoot, f_pathSvr from up6_folders where f_id = '% s'", id, id);

        JSONArray 데이터 = se.exec ( "up6_files", sql, "f_pid, f_pidRoot, f_pathSvr", "");

        JSONObject o = (JSONObject) data.get (0);

 

        FileInf 파일 = new FileInf ();

        file.id = id;

        file.pid = o.getString ( "f_pid"). trim ();

        file.pidRoot = o.getString ( "f_pidRoot"). trim ();

        file.pathSvr = o.getString ( "f_pathSvr"). trim ();

        반환 파일;

    }

   

    public Boolean exist_same_file (문자열 이름, 문자열 pid)

    {

        SqlWhereMerge 금액 = 새 SqlWhereMerge ();

        swm.equal ( "f_nameLoc", name.trim ());

        swm.equal ( "f_pid", pid.trim ());

        swm.equal ( "f_deleted", 0);

 

        String sql = String.format ( "select f_id from up6_files where % s", swm.to_sql ());

 

        SqlExec se = 새로운 SqlExec ();

        JSONArray arr = se.exec ( "up6_files", sql, "f_id", "");

        return arr.size ()> 0;

    }

   

    / **

     * 같은 이름의 디렉토리가 있는지 확인

     * @param 이름

     * @param pid

     * @return

     * /

    public Boolean exist_same_folder (문자열 이름, 문자열 pid)

    {

        SqlWhereMerge 금액 = 새 SqlWhereMerge ();

        swm.equal ( "f_nameLoc", name.trim ());

        swm.equal ( "f_deleted", 0);

        swm.equal ( "LTRIM (f_pid)", pid.trim ());

        문자열 여기서 = swm.to_sql ();

 

        String sql = String.format ( "(select f_id from up6_files where % s) union (select f_id from up6_folders where % s)", where, where);

 

        SqlExec se = 새로운 SqlExec ();

        JSONArray fid = se.exec ( "up6_files", sql, "f_id", "");

        return fid.size ()> 0;     

    }

   

    public Boolean rename_file_check (문자열 newName, 문자열 pid)

    {

        SqlExec se = 새로운 SqlExec ();           

        JSONArray res = se.select ( "up6_files"

            , "f_id"

            , new SqlParam [] {

                new SqlParam ( "f_nameLoc", newName)

                , new SqlParam ( "f_pid", pid)

            }, "");

        return res.size ()> 0;

    }

   

    public Boolean rename_folder_check (문자열 newName, 문자열 pid)

    {

        SqlExec se = 새로운 SqlExec ();

        JSONArray res = se.select ( "up6_folders"

            , "f_id"

            , 새 SqlParam [] {

                new SqlParam ( "f_nameLoc", newName)

                , new SqlParam ( "f_pid", pid)

            }, "");

        return res.size ()> 0;

    }

 

    public void rename_file (문자열 이름, 문자열 ID) {

        SqlExec se = 새로운 SqlExec ();

        se.update ( "up6_files"

            , new SqlParam [] {new SqlParam ( "f_nameLoc", name)}

            , new SqlParam [] {new SqlParam ( "f_id", id)});

    }

   

    public void rename_folder (문자열 이름, 문자열 ID, 문자열 pid) {

        SqlExec se = 새로운 SqlExec ();

        se.update ( "up6_folders"

            , new SqlParam [] {new SqlParam ( "f_nameLoc", name)}

            , new SqlParam [] {new SqlParam ( "f_id", id)});

    }

}

 

1. webuploader.js의 약 4880 줄의 코드에서 동적으로 생성 된 입력 구성 요소 아래에 webkitdirectory 속성을 추가합니다 (입력을 직접 검색 할 수도 있음).

function FileUploader (fileLoc, mgr)

{

    var _this = this;

    this.id = fileLoc.id;

    this.ui = {msg : null, 프로세스 : null, percent : null, btn : {del : null, cancel : null, post : null, stop : null}, div : null};

    this.isFolder = false; // 폴더 아님

    this.app = mgr.app;

    this.Manager = mgr; // 업로드 관리자 포인터

    this.event = mgr.event;

    this.Config = mgr.Config;

    this.fields = jQuery.extend ((), mgr.Config.Fields, fileLoc.fields); // 각 객체에는 자체 필드가 ​​있습니다.

    this.State = this.Config.state.None;

    this.uid = this.fields.uid;

    this.fileSvr = {

          pid : ""

        , ID : ""

        , pidRoot : ""

        , f_fdTask : false

        , f_fdChild : false

        , uid : 0

        , nameLoc : ""

        , nameSvr : ""

        , pathLoc : ""

        , pathSvr : ""

        , pathRel : ""

        , md5 : ""

        , lenLoc : "0"

        , sizeLoc : ""

        , FilePos : "0"

        , lenSvr : "0"

        , perSvr : "0 %"

        , 완료 : 거짓

        , 삭제됨 : false

    }; // json obj, 서버 파일 정보

    this.fileSvr = jQuery.extend (this.fileSvr, fileLoc);

2. 경로를 얻을 수 있습니다

     this.open_files = 함수 (json)

     {

         for (var i = 0, l = json.files.length; i <l; ++ i)

        {

             this.addFileLoc (json.files [i]);

         }

         setTimeout (function () {_this.PostFirst ();}, 500);

     };

     this.open_folders = 함수 (json)

    {

        for (var i = 0, l = json.folders.length; i <l; ++ i) {

            this.addFolderLoc (json.folders [i]);

        }

         setTimeout (function () {_this.PostFirst ();}, 500);

     };

     this.paste_files = 함수 (json)

     {

         for (var i = 0, l = json.files.length; i <l; ++ i)

         {

             this.addFileLoc (json.files [i]);

         }

     };

 

대부분의 백엔드 코드 로직은 동일하며 현재 MySQL, Oracle 및 SQL을 지원합니다. 사용하기 전에 데이터베이스를 구성해야합니다. 내가 작성한이 기사를 참조 할 수 있습니다. http://blog.ncmem.com/wordpress/2019/08/07/java 대용량 파일 업로드 및 다운로드 /
 

그룹에 가입하여 함께 토론 할 수 있습니다. 374992201

추천

출처blog.csdn.net/weixin_45525177/article/details/108512647