C#.NET 超大文件上传和断点续传的实现
2021-03-05 04:26
标签:文件夹 obj union cto tor 代码 sre xtend mgr 文件夹数据库处理逻辑 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 { Map for(int i = 0 , l = folders.size();i { JSONObject o = folders.getJSONObject(i); String id = o.getString("f_id"); dt.put(id, o); } return dt; } public Map { //默认加载根目录 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 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 if (StringUtils.isBlank(id)) { psort.add(0, this.root); return JSONArray.fromObject(psort); } //构建目录映射表(id,folder) Map //按层级顺序排列目录 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
{ this.addFileLoc(json.files[i]); } setTimeout(function () { _this.PostFirst(); },500); }; this.open_folders = function (json) { for (var i = 0, l = json.folders.length; 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
{ this.addFileLoc(json.files[i]); } }; 后端代码逻辑大部分是相同的,目前能够支持MySQL,Oracle,SQL。在使用前需要配置一下数据库,可以参考我写的这篇文章:http://blog.ncmem.com/wordpress/2019/08/07/java超大文件上传与下载/ 可以入群一起讨论:374992201 C#.NET 超大文件上传和断点续传的实现 标签:文件夹 obj union cto tor 代码 sre xtend mgr 原文地址:https://www.cnblogs.com/songsu/p/12912037.html
上一篇:win10电脑关闭广告
下一篇:C#中时间的减法求出时间差
文章标题:C#.NET 超大文件上传和断点续传的实现
文章链接:http://soscw.com/index.php/essay/60278.html