如何实现大文件断点续传,实现PHP断点上传功能?

2026-03-30 14:421阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1478个文字,预计阅读时间需要6分钟。

如何实现大文件断点续传,实现PHP断点上传功能?

文件夹数据库处理逻辑javapublic 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, ); }}

文件夹数据库处理逻辑

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;

}


如何实现大文件断点续传,实现PHP断点上传功能?

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​


本文共计1478个文字,预计阅读时间需要6分钟。

如何实现大文件断点续传,实现PHP断点上传功能?

文件夹数据库处理逻辑javapublic 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, ); }}

文件夹数据库处理逻辑

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;

}


如何实现大文件断点续传,实现PHP断点上传功能?

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​