WebUploader上傳超大檔案和斷點續傳實現
資料夾資料庫處理邏輯
publicclassDbFolder
{
JSONObject root;
publicDbFolder()
{
this.root =newJSONObject();
this.root.put("f_id","");
this.root.put("f_nameLoc","根目錄");
this.root.put("f_pid","");
this.root.put("f_pidRoot","");
}
/**
*將JSONArray轉換成map
*@paramfolders
*@return
*/
publicMap<String, JSONObject> toDic(JSONArray folders)
{
Map<String, JSONObject> dt =newHashMap<String, JSONObject>();
for(inti = 0 , l = folders.size();i<l;++i)
{
JSONObject o = folders.getJSONObject(i);
String id = o.getString("f_id");
dt.put(id, o);
}
returndt;
}
publicMap<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 =newSqlExec();
JSONArray folders = se.exec("up6_folders", sql,"f_id,f_nameLoc,f_pid,f_pidRoot","");
returnthis.toDic(folders);
}
publicArrayList<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;
}
returnpsort;
}
publicJSONArray build_path_by_id(JSONObject fdCur) {
String id = fdCur.getString("f_id").trim();//
String pidRoot = fdCur.getString("f_pidRoot").trim();//
//根目錄
ArrayList<JSONObject> psort =newArrayList<JSONObject>();
if(StringUtils.isBlank(id))
{
psort.add(0,this.root);
returnJSONArray.fromObject(psort);
}
//構建目錄對映表(id,folder)
Map<String, JSONObject> dt =this.foldersToDic(pidRoot);
//按層級順序排列目錄
psort =this.sortByPid(dt, id, psort);
SqlExec se =newSqlExec();
//是子目錄->新增根目錄
if(!StringUtils.isBlank(pidRoot))
{
JSONObject root = se.read("up6_files"
,"f_id,f_nameLoc,f_pid,f_pidRoot"
,newSqlParam[] {newSqlParam("f_id", pidRoot) });
psort.add(0, root);
}//是根目錄->新增根目錄
elseif(!StringUtils.isBlank(id) && StringUtils.isBlank(pidRoot))
{
JSONObject root = se.read("up6_files"
,"f_id,f_nameLoc,f_pid,f_pidRoot"
,newSqlParam[] {newSqlParam("f_id", id) });
psort.add(0, root);
}
psort.add(0,this.root);
returnJSONArray.fromObject(psort);
}
publicFileInf read(String id) {
SqlExec se =newSqlExec();
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 =newFileInf();
file.id = id;
file.pid = o.getString("f_pid").trim();
file.pidRoot = o.getString("f_pidRoot").trim();
file.pathSvr = o.getString("f_pathSvr").trim();
returnfile;
}
publicBoolean exist_same_file(String name,String pid)
{
SqlWhereMerge swm =newSqlWhereMerge();
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 =newSqlExec();
JSONArray arr = se.exec("up6_files", sql,"f_id","");
returnarr.size() > 0;
}
/**
*檢查是否存在同名目錄
*@paramname
*@parampid
*@return
*/
publicBoolean exist_same_folder(String name,String pid)
{
SqlWhereMerge swm =newSqlWhereMerge();
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 =newSqlExec();
JSONArray fid = se.exec("up6_files", sql,"f_id","");
returnfid.size() > 0;
}
publicBoolean rename_file_check(String newName,String pid)
{
SqlExec se =newSqlExec();
JSONArray res = se.select("up6_files"
,"f_id"
,newSqlParam[] {
newSqlParam("f_nameLoc",newName)
,newSqlParam("f_pid",pid)
},"");
returnres.size() > 0;
}
publicBoolean rename_folder_check(String newName, String pid)
{
SqlExec se =newSqlExec();
JSONArray res = se.select("up6_folders"
,"f_id"
,newSqlParam[] {
newSqlParam("f_nameLoc",newName)
,newSqlParam("f_pid",pid)
},"");
returnres.size() > 0;
}
publicvoidrename_file(String name,String id) {
SqlExec se =newSqlExec();
se.update("up6_files"
,newSqlParam[] {newSqlParam("f_nameLoc", name) }
,newSqlParam[] {newSqlParam("f_id", id) });
}
publicvoidrename_folder(String name, String id, String pid) {
SqlExec se =newSqlExec();
se.update("up6_folders"
,newSqlParam[] {newSqlParam("f_nameLoc", name) }
,newSqlParam[] {newSqlParam("f_id", id) });
}
}
1.在webuploader.js大概4880行程式碼左右,在動態生成的input元件的下面(也可以直接搜尋input),增加webkitdirectory屬性。
functionFileUploader(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(vari = 0, l = json.files.length; i < l; ++i)
{
this.addFileLoc(json.files[i]);
}
setTimeout(function() { _this.PostFirst(); },500);
};
this.open_folders =function(json)
{
for(vari = 0, l = json.folders.length; i < l; ++i) {
this.addFolderLoc(json.folders[i]);
}
setTimeout(function() { _this.PostFirst(); }, 500);
};
this.paste_files =function(json)
{
for(vari = 0, l = json.files.length; i < l; ++i)
{
this.addFileLoc(json.files[i]);
}
};
後端程式碼邏輯大部分是相同的,目前能夠支援MySQL,Oracle,SQL。在使用前需要配置一下資料庫,可以參考我寫的這篇文章:
可以入群一起討論:374992201