• Web 超大文件上传解决方案:分片断点上传(一)


    文件夹数据库处理逻辑

    public class DbFolder

    {

        JSONObject root;

       

        public 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转换成map

         * @param folders

         * @return

         */

        public Map<String, JSONObject> toDic(JSONArray folders)

        {

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

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

            {

                JSONObject o = folders.getJSONObject(i);

                String id = o.getString("f_id");

                dt.put(id, o);

            }

            return dt;

        }

       

        public 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 = new 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) {

            String cur = idCur;

            while (true)

            {

                //key不存在

                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;

            }

            return psort;

        }

       

        public JSONArray build_path_by_id(JSONObject fdCur) {

            String id = fdCur.getString("f_id").trim();//

            String 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,folder)

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

            //按层级顺序排列目录

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

            SqlExec se = new 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, root);

            }//是根目录->添加根目录

            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, root);

            }

            psort.add(0, this.root);

            return JSONArray.fromObject(psort);

        }

       

        public FileInf read(String id) {

            SqlExec se = new 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 data = se.exec("up6_files", sql, "f_pid,f_pidRoot,f_pathSvr","");

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

            FileInf file = 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();

            return file;

        }

       

        public Boolean exist_same_file(String name,String pid)

        {

            SqlWhereMerge swm = new 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 = new SqlExec();

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

            return arr.size() > 0;

        }

       

        /**

         * 检查是否存在同名目录

         * @param name

         * @param pid

         * @return

         */

        public Boolean exist_same_folder(String name,String pid)

        {

            SqlWhereMerge swm = new SqlWhereMerge();

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

            swm.equal("f_deleted", 0);

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

            String where = 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 = new SqlExec();

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

            return fid.size() > 0;     

        }

       

        public Boolean rename_file_check(String newName,String pid)

        {

            SqlExec se = new 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(String newName, String pid)

        {

            SqlExec se = new SqlExec();

            JSONArray res = se.select("up6_folders"

                , "f_id"

                , new SqlParam[] {

                    new SqlParam("f_nameLoc",newName)

                    ,new SqlParam("f_pid",pid)

                },"");

            return res.size() > 0;

        }

        public void rename_file(String name,String id) {

            SqlExec se = new SqlExec();

            se.update("up6_files"

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

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

        }

       

        public void rename_folder(String name, String id, String pid) {

            SqlExec se = new SqlExec();

            se.update("up6_folders"

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

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

        }

    }

    1.在webuploader.js大概4880行代码左右,在动态生成的input组件的下面(也可以直接搜索input),增加webkitdirectory属性。

    function FileUploader(fileLoc, mgr)

    {

        var _this = this;

        this.id = fileLoc.id;

        this.ui = { msg: null, process: 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);//每一个对象自带一个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%"

            , complete: false

            , deleted: false

        };//json obj,服务器文件信息

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

    2.可以获取路径

         this.open_files = function (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 = function (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 = function (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

  • 相关阅读:
    guake 3.4发布,支持切分窗口
    tmux下vim颜色不正常问题
    tmux下make menuconfig背景色不正常问题
    命令行工具PathMarker
    busybox syslog介绍
    linux下检测可用串口并使用minicom打开(改进版)
    linux下检测可用串口并使用minicom打开
    guake终端复制标签页
    shell命令行混合进制计算器smartbc
    在shell脚本中添加暂停,按任意键继续
  • 原文地址:https://www.cnblogs.com/songsu/p/12774207.html
Copyright © 2020-2023  润新知