spring大文件分块上传原理解析2

这两天关于大文件上传这个问题搞得很是头疼,昨天下班回去调研了下,对于不同大小的文件对应有几种解决办法:

l   500M以下的用http协议传输(网上一搜大把的),比如Flash,Plupload,WebUploader,SilverUpload,swfupload等,这些都是用Flash或者Silverlight(微软已放弃的技术)来实现的。

l   500M以上1G以下的用http协议分块。如HTML5(不支持低版本浏览器,且比较消耗系统资源)

l   1G~10G以上的使用HttpUploader6传输。QQ邮箱,百度其它网盘均采用了控件技术来实现,与HTML5Flash技术相比控件技术在稳定性可扩展性方面都有巨大优势。

l   100G~1T以上的使用HttpUploader7传输。这个属于特殊行业需求,不过部分行业也确实需要,而且成熟的解决方案也不多。

第一种很简单,博主在这里就不谈了。

第二种网上也比较多,不过可惜的是资料都非常凌乱,没有统一的规范,都是东一榔头西一棒子的,让人看的头晕。不是缺文件就是缺图片,不是缺数据库就是缺代码。弄一个完整的项目真心很不容易。

 

1已上传的文件怎么唯一标识,然后不用再次上传

2.前端怎么分块

3.后端怎么接受分块,组装多个分块

 

一、取文件的md5值,上传后把md5存数据库;再次上传时获取前端传来的md5到数据库中查询,如果已存在,则不用再次上传。在HttpUploader6也已经封装好了,不需要你再做任何处理。

 

二、关于前端分块,HttpUploader6这个控件已经做好了,不需要开发人员再做其它的处理,直接使用就行了。

 

三、后端接受分块

up6这个项目中有一个f_post.jsp页面,用来接收分块数据。

代码如下:

说明:它的代码是JSP页面的,只需要修改一下就可以直接用在spring

String uid          = request.getHeader("uid");//

String id           = request.getHeader("id");

String md5          = request.getHeader("md5");

String lenSvr       = request.getHeader("lenSvr");

String lenLoc       = request.getHeader("lenLoc");

String blockOffset  = request.getHeader("blockOffset");

String blockSize    = request.getHeader("blockSize");

String blockIndex   = request.getHeader("blockIndex");

String complete     = request.getHeader("complete");

String pathSvr      = request.getHeader("pathSvr");

pathSvr = PathTool.url_decode(pathSvr);

 

//参数为空

if( StringUtils.isBlank( uid )

    || StringUtils.isBlank( id )

    || StringUtils.isBlank( blockOffset )

    || StringUtils.isBlank(pathSvr))

{

    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;

try

{

    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) fileItr.next(); 

}

 

//文件块验证

if(Integer.parseInt(blockSize) == rangeFile.getSize())

{

    //保存文件块数据

    FileBlockWriter res = new FileBlockWriter();

    res.write( Long.parseLong(blockOffset),pathSvr,rangeFile);

    rangeFile.delete();

    out.write("ok");

}

else

{

    rangeFile.delete();

    out.write("block size error");

}%>

 

项目下载地址:

http://download.csdn.net/download/activexme/10214556

http://www.ncmem.com/download/up6.3/jsp/Uploader6.3Oracle.rar

https://pan.baidu.com/s/1dGYV83n

https://pan.baidu.com/s/1kWjYyN1

https://pan.baidu.com/s/1bqADhl9


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值