求超大文件上传方案( WebUploader )

简介:

文件夹数据库处理逻辑

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超大文件上传与下载/

相关文章
|
1月前
|
JSON 前端开发 Java
layui上传图片,前端直接拷代码,后端……
layui上传图片,前端直接拷代码,后端……
29 0
|
JavaScript 对象存储
JS - 阿里云 OSS 文件下载通用办法(支持跨域)
JS - 阿里云 OSS 文件下载通用办法(支持跨域)
3363 0
JS - 阿里云 OSS 文件下载通用办法(支持跨域)
|
3月前
|
前端开发
elementui-upload组件自定义样式上传(upload中常用的属性,但是网络上却找不到教程)(解决bug删除之后再次上传会上传删除的图片)专注后端工程师的前端速成
elementui-upload组件自定义样式上传(upload中常用的属性,但是网络上却找不到教程)(解决bug删除之后再次上传会上传删除的图片)专注后端工程师的前端速成
67 0
|
8月前
|
监控 UED
大文件上传如何做断点续传
大文件上传如何做断点续传
221 0
|
9月前
|
编解码 前端开发 JavaScript
layui框架实战案例(5):基于PHP后端的layUI上传视频到七牛云对象储存并自动转码
layui框架实战案例(5):基于PHP后端的layUI上传视频到七牛云对象储存并自动转码
197 0
|
10月前
|
前端开发 关系型数据库 MySQL
大文件上传
大文件上传
138 0
|
10月前
|
JavaScript
FormData可以做些什么事,除了文件上传当然还有文件分片上传呀
FormData 是一个用于表单数据的键值对,可以通过 FormData 对象来模拟表单提交,也可以通过 FormData 对象来实现文件上传。
219 0
|
11月前
|
数据安全/隐私保护 UED 索引
大文件上传和优化
最近项目里面有一些视频处理的功能,大概流程就是后端拿到文件以后,使用FFmpeg等底层命令进行去水印,裁切等功能,虽然现在是短视频的年代,但是依然会出现一些高分辨率,高时长的大文件视频,这时候因为一些原因,如网络等,失败率会陡增。
|
PHP 计算机视觉
yii2.0上传图片的时候如何实现自动压缩?
yii2.0上传图片的时候如何实现自动压缩?
230 0
|
移动开发 JSON JavaScript
《大胖 • 小课》- 不用 js 实现文件无刷新上传
这是《大胖小课》栏目的专题一《说说文件上传那些事儿》的第3节-《不用 js 实现文件无刷新上传》 专题已经更新章节: 《大胖 • 小课》- 我是这样理解文件上传原理的 《大胖 • 小课》- 写一个文件上传接口 上一节,我们实现了一个简单的文件上传接口,服务端的文件保存我们使用koa-body来完成。 从这节开始我们开始进行梳理前端各种文件上传的场景,尽量覆盖的更全面。 既然要说不用 js 实现文件无刷新上传,那就要先说说最原始的文件上传,也就是在 ie 时代是怎么处理的。
110 0
《大胖 • 小课》- 不用 js 实现文件无刷新上传

热门文章

最新文章