html+HTTP超⼤视频上传解决⽅案
这⾥只写后端的代码,基本的思想就是,前端将⽂件分⽚,然后每次访问上传接⼝的时候,向后端传⼊参数:当前为第⼏块⽂件,和分⽚总数
下⾯直接贴代码吧,⼀些难懂的我⼤部分都加上注释了:
上传⽂件实体类:
看得出来,实体类中已经有很多我们需要的功能了,还有实⽤的属性。如MD5秒传的信息。
public class FileInf {
public FileInf(){}
public String id="";
public String pid="";
public String pidRoot="";
/**  * 表⽰当前项是否是⼀个⽂件夹项。    */
public boolean fdTask=false;
//  /// 是否是⽂件夹中的⼦⽂件  /// </summary>
public boolean fdChild=false;
/**  * ⽤户ID。与第三⽅系统整合使⽤。    */
public int uid=0;
/**  * ⽂件在本地电脑中的名称  */
public String nameLoc="";
/**  * ⽂件在服务器中的名称。  */
public String nameSvr="";
/**  * ⽂件在本地电脑中的完整路径。⽰例:D:\ */
public String pathLoc="";
/
**  * ⽂件在服务器中的完整路径。⽰例:F:\\ftp\\uer\\    */
public String pathSvr="";
/**  * ⽂件在服务器中的相对路径。⽰例:/www/web/  */
public String pathRel="";
/**  * ⽂件MD5    */
public String md5="";
/**  * 数字化的⽂件长度。以字节为单位,⽰例:120125    */
public long lenLoc=0;
/**  * 格式化的⽂件尺⼨。⽰例:10.03MB  */
public String sizeLoc="";
/**  * ⽂件续传位置。  */
public long offset=0;
/**  * 已上传⼤⼩。以字节为单位 */
public long lenSvr=0;
/**  * 已上传百分⽐。⽰例:10%  */
public String perSvr="0%";
public boolean complete=false;
public Date PostedTime = new Date();
public boolean deleted=false;
/**  * 是否已经扫描完毕,提供给⼤型⽂件夹使⽤,⼤型⽂件夹上传完毕后开始扫描。  */
public boolean scaned=false;
}
⾸先是⽂件数据接收逻辑,负责接收控件上传的⽂件块数据,然后写到服务器的⽂件中。控件已经提供了块的索引,⼤⼩,MD5和长度信息,我们可以根据需要来灵活进⾏处理,也可以将⽂件块的数据保存到分布式存储系统中。
<%
out.clear();
String uid            = Header("uid");//
String id              = Header("id");
String lenSvr      = Header("lenSvr");
String lenLoc      = Header("lenLoc");
String blockOffset = Header("blockOffset");
String blockSize  = Header("blockSize");
String blockIndex  = Header("blockIndex");
String blockMd5        = Header("blockMd5");
String complete        = Header("complete");
String pathSvr        = "";
//参数为空
if(  StringUtils.isBlank( uid )
|| StringUtils.isBlank( id )
|| StringUtils.isBlank( blockOffset ))
{
XDebug.Output("param is null");
return;
}
/
/ Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List files = null;
files = upload.parseRequest(request);
}
catch (FileUploadException e)
{// 解析⽂件数据错误
out.println("read file data error:" + e.toString());
return;
}
FileItem rangeFile = null;
// 得到所有上传的⽂件
Iterator fileItr = files.iterator();
// 循环处理所有⽂件
while (fileItr.hasNext())
{
// 得到当前⽂件
rangeFile = (FileItem) ();
if(StringUtils.equals( FieldName(),"pathSvr"))
{
pathSvr = String();
pathSvr = PathTool.url_decode(pathSvr);
}
}
boolean verify = false;
String msg = "";
String md5Svr = "";
long blockSizeSvr = Size();
if(!StringUtils.isBlank(blockMd5))
{
md5Svr = Md5Tool.InputStream());
}
verify = Integer.parseInt(blockSize) == blockSizeSvr;
if(!verify)
{
msg = "block size error sizeSvr:" + blockSizeSvr + "sizeLoc:" + blockSize;
if(verify && !StringUtils.isBlank(blockMd5))
{
verify = md5Svr.equals(blockMd5);
if(!verify) msg = "block md5 error";
}
if(verify)
{
//保存⽂件块数据
FileBlockWriter res = new FileBlockWriter();
//仅第⼀块创建
if( Integer.parseInt(blockIndex)==1) res.CreateFile(pathSvr,Long.parseLong(lenLoc));    res.write( Long.parseLong(blockOffset),pathSvr,rangeFile);
up6_biz_event.file_post_block(id,Integer.parseInt(blockIndex));
JSONObject o = new JSONObject();
o.put("msg", "ok");
o.put("md5", md5Svr);
o.put("offset", blockOffset);//基于⽂件的块偏移位置
msg = o.toString();
}
rangeFile.delete();
out.write(msg);
%>
⽂件初始化部分
<%
out.clear();
WebBase web = new WebBase(pageContext);
String id    = web.queryString("id");
String md5        = web.queryString("md5");
String uid        = web.queryString("uid");
String lenLoc      = web.queryString("lenLoc");//数字化的⽂件⼤⼩。12021
String sizeLoc    = web.queryString("sizeLoc");//格式化的⽂件⼤⼩。10MB
String callback = web.queryString("callback");
String pathLoc    = web.queryString("pathLoc");
pathLoc            = PathTool.url_decode(pathLoc);前端大文件上传解决方案
//参数为空
if ( StringUtils.isBlank(md5)
&& StringUtils.isBlank(uid)
&& StringUtils.isBlank(sizeLoc))
{
out.write(callback + "({\"value\":null})");
return;
}
FileInf fileSvr= new FileInf();
fileSvr.id = id;
fileSvr.fdChild = false;
fileSvr.uid = Integer.parseInt(uid);
fileSvr.nameLoc = Name(pathLoc);
fileSvr.pathLoc = pathLoc;
fileSvr.lenLoc = Long.parseLong(lenLoc);
fileSvr.sizeLoc = sizeLoc;
fileSvr.deleted = false;
fileSvr.md5 = md5;
fileSvr.nameSvr = fileSvr.nameLoc;
//所有单个⽂件均以uuid/file⽅式存储
PathBuilderUuid pb = new PathBuilderUuid();
fileSvr.pathSvr = pb.genFile(fileSvr.uid,fileSvr);
fileSvr.pathSvr = place("\\","/");
DBConfig cfg = new DBConfig();
DBFile db = cfg.db();
FileInf fileExist = new FileInf();
boolean exist = db.exist_file(md5,fileExist);
//数据库已存在相同⽂件,且有上传进度,则直接使⽤此信息if(exist && fileExist.lenSvr > 1)
{
fileSvr.nameSvr            = fileExist.nameSvr;
fileSvr.pathSvr        = fileExist.pathSvr;
fileSvr.perSvr              = fileExist.perSvr;
fileSvr.lenSvr              = fileExist.lenSvr;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。