评论

收藏

[其他] 百度WebUploader实现文件上传下载功能实例解析

网络安全 网络安全 发布于:2021-07-07 16:39 | 阅读数:452 | 评论:0

  
百度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);
  }
  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);
  }
  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);
  }
  };
  后端代码逻辑大部分是相同的,目前能够支持MySQL,Oracle,SQL。在使用前需要配置一下数据库,可以参考我写的这篇文章:http://blog.ncmem.com/wordpress/2019/08/07/java超大文件上传与下载/



  
关注下面的标签,发现更多相似文章