java 断点续传组件_chunkupload 文件上传断点续传组件(java) - 正式发布
chunkupload简介
chunkupload是一款基于java语言的断点续传组件,针对文件上传,非文件下载,集成方便,使用简单。
chunkupload实现如下功能:
· 实现断点续传
· 对于同一个文件,允许多用户同时上传,并且上传的用户越多,上传越快
· 线程安全
· 同一物理机下进程安全
· 文件自动切片,支持合并
· 内存占用小
· 高效稳定,高可用
· 易集成,无第三方依赖
chunkupload只关注文件上传,并没有安全机制,开发者需要自行设计安全控制策略,防范用户上传非法文件,chunkupload默认上传的文件是安全的。
chunkupload功能完备,服务端和客户端无缝衔接,开发者只需关注自身业务和UI展现即可。
为了尽可能提升用户体验,chunkupload在客户端的技术选型有些激进,采用了许多先进的技术,比如:web worker、XMLHttpRequest数据传送进度、FileReader、file slice等,所以对浏览器兼容性会有一定影响,在确定使用chunkupload前请务必仔细斟酌!
chunkupload集成
服务端
chunkupload服务端运行需要JRE7或更高版本,无任何第三方依赖。
1.引用chunkupload.1.0.jar。
2.在项目web.xml中配置chunkupload servlet。
1
2 ChunkUpload
3 com.iyangyuan.chunkupload.servlet.DispatcherServlet
4
5
6 ChunkUpload
7 /chunkupload/*
8
强烈建议将chunkupload servlet配置在安全框架之后(比如shiro),mvc框架之前(如springmvc)。
chunkupload servlet中的拦截路径(url-pattern),如果无特殊需求,无需更改,假如一定要更改,还需要同步更改客户端的配置。
客户端
chunkupload客户端对浏览器的要求比较高,目前已知chrome、firefox浏览器完整支持,360浏览器如果启用webkit内核,应该也没有问题,IE浏览器绝对不支持(想都不要想),其他浏览器未知。
开发者可能会问,为什么兼容性如此捉襟见肘?
chunkupload是新时代的产物,它代表了时代的发展方向,它的价值在于提供最先进的技术示范,而不是沉重的历史包袱。
chunkupload在客户端的实现,无任何第三方依赖,只关注与服务端的逻辑交互,并不干预UI展现,为开发者创造最大的发挥空间。
1.引用dawn.1.0.js,用于在客户端计算文件MD5,dawn.js是chunkupload的一个附属项目,相比未经优化的javascript计算MD5方法,dawn.js将计算效率提升50%左右。
2.引用chunkupload.1.0.js,此乃chunkupload客户端核心库,封装了所有上传所需的逻辑。
chunkupload使用
服务端
服务端需要创建chunkupload.properties配置文件,放置在项目classpath根目录下,也就是大家熟悉的log4j.properties所在目录,配置文件中有如下选项:
· root 文件存储路径,相当于根目录,内部还会有chunkupload创建的目录结构;假如同一台物理机配置多个文件上传容器,此项配置应该设置成统一目录,默认为[/data]。
· fileLockCapacity文件锁缓存容量,一般设置为2048即可,开发者可根据服务器性能自行调整,默认为2048。
· createFile 文件上传完成后,是否立即合并切片,生成完整文件;强烈建议此配置项设置为false,一般情况下,切片无需合并,就算合并,也不需要立即合并;如果设为true,立即合并文件会占用大量服务器资源,并且会造成客户端长时间等待;合并的速度大约100M/S,视服务器具体性能而定,默认为true。
至此,服务端已经可以正常运作了。
客户端
默认情况下,客户端无需任何配置。
假如开发者更改过chunkupload servlet拦截路径,那么chunkupload.1.0.js中的Block.config.api配置也需要做相应的改动,具体情况需要开发者自行斟酌。
ChunkUpload 类
文件上传核心实现类。
实例化
上传组件初始化需要提供目标文件。
1 /**2
3 * 实例化ChunkUpload组件4
5 * file 要上传的目标文件对象6
7 */
8
9 var cu = new ChunkUpload(file);
upload 方法
upload 方法用来启动文件上传,通过四个异步回调完成上传交互,无返回值。
1 cu.upload({2 "success": function(block){3 /**4 * 上传成功回调5 *6 * block 对象,块对象7 */
8 },9 "error": function(e){10 /**11 * 上传异常回调12 *13 * e 字符串,异常信息14 */
15 },16 "md5Progress": function(n){17 /**18 * 计算文件md5进度回调19 *20 * n 整型,进度数值21 */
22 },23 "uploadProgress": function(n){24 /**25 * 上传进度回调26 *27 * n 整型,进度数值28 */
29 }30 });
abort方法
abort方法用来中断上传,可以在任意阶段任意时刻中断,无返回值。
1 cu.abort();
Block 类
文件控制类。
实例化
1 /**2
3 * 初始化块对象4
5 * md5 文件md5,32位6
7 * size 文件大小,字节8
9 */
10
11 var block = new Block(md5, size);
info方法
获取块(文件)信息,返回javascript对象。
1 block.info();
返回示例:
1 {2
3 "status": 0, //业务状态,0表示成功
4
5 "data": { //数据域
6
7 "chunks": [ //所有切片信息
8
9 {10
11 "md5": "e114c21f7d9f8ad1a8551225c3d085be", //切片md5
12
13 "n": 1 //切片序号
14
15 },16
17 {18
19 "md5": "48357caa7607a636e858315e1b0216d5",20
21 "n": 2
22
23 },24
25 {26
27 "md5": "a23c6ab7104d2ce4ae3c1624ea7eab55",28
29 "n": 3
30
31 },32
33 {34
35 "md5": "3eb29f6241d6fbb35cc715fff2b9ab91",36
37 "n": 4
38
39 },40
41 {42
43 "md5": "120ddc96b878a63adcd7835cbac0c95c",44
45 "n": 5
46
47 }48
49 ],50
51 "chunkNum": 5, //切片数量
52
53 "md5": "f1154ca6fab7f3628927c1268f3570fd", //文件md5
54
55 "state": 1, //文件状态,1为上传完成
56
57 "size": 20879935 //文件长度
58
59 }60
61 }
delete方法
删除块(文件) ,无返回值。
1 block.delete();
chunkupload服务端存储珠玑
任何上传的文件都会在服务端进行切片处理,每个切片4M大小。
通过文件MD5和文件大小,唯一确定一个文件。
目录分散策略,基于开发者自定义的rootpath,文件MD5前6位,每两位作为一级目录,最后以文件MD5+文件长度作为最终目录,所有文件信息均存储在此目录下。
假如文件MD5为[071287fffa974b878732a7a17858be36],长度为[20879935],开发者自定义的rootpath为[/data],那么生成的目录结构为:[/data/07/12/87/071287fffa974b878732a7a17858be3620879935]。
chunkupload存储的关于文件的所有信息,均为二进制文件,并且文件名称固定,具体组织如下图:
chunkupload未来
展望chunkupload,未来无疑是开源的,只不过现在还不是时候,因为作者觉得它还不够完美。
通过大家的宝贵意见、建议,作者会不断完善、改进chunkupload,等到chunkupload成熟时,也就是开源之日!
希望大家多多与我交流~
chunkupload组件下载
你可以下载如下内容:
·chunkupload.jar
·chunkupload.js
·dawn.js
·脚手架(集成了chunkupload的空白项目)
附:客户端使用示例
上传示例
1
2
3
ChunkUpload 文件上传示例
4
5
6
7 body{
8 font-family:"Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif;
9 }
10 body > div{
11 width:200px;
12 margin:20px auto 0 auto;
13 }
14 body > div.form{
15 text-align:center;
16 }
17 body > div.form > input{
18 margin-top:12px;
19 border:1px dashed #dcdcdc;
20 padding:4px 8px;
21 cursor:pointer;
22 background-color:transparent;
23 color:#686868;
24 font-family:inherit;
25 outline:none;
26 width:100%;
27 box-sizing:border-box;
28 }
29 body > div.form > input.button{
30 font-size:15px;
31 line-height:29px;
32 padding:0 10px;
33 }
34 body > div.form > input:hover{
35 background-color:#f5f5f5;
36 }
37 div.info > div{
38 margin:auto;
39 height:31px;
40 width:88px;
41 background:url('data:image/gif;base64,R0lGODlhWAAfAMMBAAAAAPXcoPDLdfTboP+dzv+z2f+AwP9brfPZoAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFFAAKACwAAAAAWAAfAAAE/xDISau9OOvNd/hgKI5kaZ5oWkqB4L5wLM90bd+4PLB57//A2g7QChqPyNiwmGw6c8undKrj/STULC3qAxQAMKw0IUiYyy6yWf3j5rwGsMsrd5JfdzQelre5bxIFcROCdUBneWx6aHd9UFY1hAaTAJQTRo6LfYl8i0KQMoGCk6Slg0FsnGmdq3uZSpBiAnCmtaWGqK4yiq2eVURzwbS2pBK3hzabezOvLlxyYMPEg5aXWk1uWNLTxaOU10lR2oHckwcHlIWn4Ed/c97ECOfocJWy7EDus/C28udx8HAlaZYP1ItttRAgKEYBGS9NelL10LevnC2BR1RhM3iwAD9uGE5/NBvpg+IcLx5BhvTxiiDBGSYPivJI0xo+JzHfZfjyxNHDGC9/MaFhb0bRmzg5hoqE9EnOpk2XDJhKtarVq1izat3KtSvWDmDDih0LNgIAIfkEBRQACgAsAwAGADEAFgAABJ9QyEmrBMDqzbsFRTZh3pacZQUaogC2qZRQc4oVLLbCaS2XOpyBNdTxYjPf5iYcOp+kmCfqaj6vUClHlFlhr5is9nOpfsGAonGs6lrPUOvR1r3BnYdDEZemskdvWAh5ejs5fyqBV4N5LHKIiXcGCAhORnMmAkoUXpJgkEsFimeYPVsgond+oEtMoq86rJpTIZdBpbIjLBp9spu8W7nCshEAIfkEBRQACgAsAwAFADoAFgAABLdQyEmrAMDqzWXySdhZQJFN2KhS30oWxnmZrtp++IrB2B7XNmAPZogVezKgJidobXbEonSaUjaZE2erOpt6vz+gk5VFSTIlsBdDFTffnRM6qo4Bjkirbl4Hp6VJHTdxaD59BgcHRzx2ei5/dQiJiml3XI5xdGCSiTF0gZhPml8ICIB5oSqQh22pjwWjdaAuOWNjJCWwfZeuWoS5sME9rh4VtxolSMo0vXqWyGHESyOzZ9LHx9LaAhEAIfkEBRQACgAsAgAFAEQAFgAABMtQyEmrvTjrmmT63VYBgGieVIhSQFFO5CpPYWefrfEK7T5fto+g9iMVdKSc75dqOlWZ5NGgoyaXK6HqNvR4vxbjlEoux2ZQcHrL2uXK8DhWdGODo5LSO24GmJlqXSIvemN8Vn5ISVkaaRgxe4dwkXOAGpBGkmQHB1ZHfmeWRYZ8CJydSkiiTJGlpzqGlauDpHEICGRXsrMbrZq5THVPXcJhBbWSu2g0MmLIucona4BSx9YuoaKOzBbbMNi6RtHaRToXoLyO3nfneLw/EQAh+QQFFAAKACwCAAUASwAXAAAE3lDISau9OOtdE/9gKI4aAJDo5qUSUJyTyVJeYgtrfeesa8ACF5C1khSLuEkNZSr8TL4haKdMWpM8o/YDdRp+X6iUg9xer2VR0/ttu2Wh5bFKP5eAPrd+P55W00t2FjAneXtvAG9xGkhzHIRBbIdhiU9QM5gxhZKTb5J9mSAyXZ1tBwdhTolwoZiGkwinqFFPrZmvh7GnP5+haTSinHsICG1ioBdywFo8WRu4pcaZjslqBcKdyGQYv2ZcLtelrCS/3YKia9fql7btgy/HXdofZYHVTD8Xq+78FMjz/TBEAAA7') no-repeat center center;42 padding:2px;
43 box-sizing:border-box;
44 }
45 div.info > div > p{
46 text-align:right;
47 font-size:12px;
48 margin:0;
49 }
50
51
52
53
54
55
56
57
58
java 断点续传组件_chunkupload 文件上传断点续传组件(java) - 正式发布相关推荐
- java 上传断点续传_JAVA大文件上传断点续传解决方案
javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 Save 改进后的代码不需要for ...
- JAVA大文件上传断点续传解决方案
JAVA大文件上传断点续传解决方案 参考文章: (1)JAVA大文件上传断点续传解决方案 (2)https://www.cnblogs.com/songsu/p/11834425.html (3)ht ...
- java使用smartupload组件实现文件上传的方法
为什么80%的码农都做不了架构师?>>> 本文实例讲述了java使用smartupload组件实现文件上传的方法.分享给大家供大家参考.具体分析如下:文件上传几乎是所有网站都具 ...
- SpringMVC(SSM)框架搭建JavaWeb项目时,前端页面文件上传,后台Java下载功能实现及相关问题记录说明
看在前面:前端页面通过input控件实现文件上传,后台Java使用SpringMVC框架的实现网上有较多教程,但是真正配置一遍下来不报错的较少,所以本博客前面先介绍一遍完整的设置步骤,然后介绍遇到的一 ...
- 使用commons-fileupload-1.2.1.jar等组件实现文件上传
使用的主要jar包:commons-io-1.3.2.jar包;commons-fileupload-1.2.1.jar包:commons-lang-2.3.jar,在使用组件实现文件上传时候要注意前 ...
- jsp文件通常用common_29.jsp-动态生活之用Commons-FileUpload组件控制文件上传
sizeMax):设置请求信息实体内容的最大允许的字节数 ★ public List parseRequest(HttpServletRequest req): 解析form表单中的每个字符的数据,返 ...
- jquery组件WebUploader文件上传用法详解
这篇文章主要为大家详细介绍了jquery组件WebUploader文件上传用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 WebUploader是由Baidu WebFE(FEX)团队开发的一 ...
- 微信小程序之使用vant-3组件Uploader文件上传
效果图: 微信小程序之使用vant-3组件Uploader文件上传 1.把vant的weapp包加进来 2.在app.json文件里面"usingComponents"加载进来才能 ...
- java利用dropzone多文件上传
DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库, 它是轻量级的,不依赖任何其他类库(如JQuery)并且高度可定制.文档官网https://www.dropzonejs.com/ ...
最新文章
- 树莓派Android Things物联网开发:创建一个Things项目
- 在线作图|如何绘制一张坡度图
- 大量数据生成excel时候造成jvm内存泄漏问题的解决与测
- linux--GD库安装
- Spring之AOP实现
- 苦思冥想时,吃什么,尝一口,酥脆掉渣,鲜掉眉毛!
- php w 框架叫什么意思,框架是什么,为啥要用框架. 框架解决了什么
- Lync Server 2013 安装准备工具 for Win 2008 R2
- python画柱状图-python 使用 matplotlib.pyplot来画柱状图和饼图
- struct和class的区别
- javascript入门到进阶 - js系列一:三种基本的数据结构
- 怎么把腾讯视频qlv格式转换成为mp4视频(无需软件详细操作)
- 气温和降水空间栅格数据下载RS123
- HTML文字溢出出现.....
- 喜欢游戏学计算机,我喜欢电脑游戏小学作文
- Ajax请求传递中文参数
- 谷歌学术得到论文被引用信息
- Java自学.接口学习笔记!
- 怎么制作手机网站?如何建一个wap手机网站?所谓手机网站指手机能访问的网站,现在手机浏览器对html...
- 字节跳动的真实工作体验
热门文章
- Linux mysql federated_MySQL的FEDERATED引擎实现类Oracle的DBlink
- oracle元数据存储在表空间,oracle db中数据和元数据的概念
- 《阿里巴巴JAVA开发手册》发布详尽版,新增16条设计规约
- 为了帮视障人士“看见”,阿里工程师做了哪些努力?
- 如何成为一个设计师和程序员混合型人才
- 技术分享:游戏中的 2D 可见性
- 用 Unity 探究 2D 游戏的打击感
- Xbox 2021年科隆展发表会将于8月25日凌晨1点开始
- MongoDB管理:慎用local、admin数据库
- 实例讲解如何通过Oracle成功发送邮件-入门基础