博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
chunkupload 文件上传断点续传组件(java) - 正式发布
阅读量:6608 次
发布时间:2019-06-24

本文共 5938 字,大约阅读时间需要 19 分钟。

 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",   //切片md512 13                 "n": 1  //切片序号14 15             },16 17             {18 19                 "md5": "48357caa7607a636e858315e1b0216d5",20 21                 "n": 222 23             },24 25             {26 27                 "md5": "a23c6ab7104d2ce4ae3c1624ea7eab55",28 29                 "n": 330 31             },32 33             {34 35                 "md5": "3eb29f6241d6fbb35cc715fff2b9ab91",36 37                 "n": 438 39             },40 41             {42 43                 "md5": "120ddc96b878a63adcd7835cbac0c95c",44 45                 "n": 546 47             }48 49         ],50 51         "chunkNum": 5,   //切片数量52 53         "md5": "f1154ca6fab7f3628927c1268f3570fd",   //文件md554 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 51 52 53
54
55
56
57
58
59
60
61
62
63

64
65

66
67
68 69 70 71 115
View Code

 

获取文件信息示例

 

1  2      3         ChunkUpload 获取文件信息示例 4         
5
6 56 57 58
59
60

文件md5

61
62

文件大小(字节)

63
64

65
66
67
68
69

70

71
72 73 74 75 91
View Code

 

删除文件示例

 

1  2      3         ChunkUpload 删除文件示例 4         
5
6 56 57 58
59
60

文件md5

61
62

文件大小(字节)

63
64

65
66
67
68
69

70

71
72 73 74 75 91
View Code

 

转载地址:http://nliso.baihongyu.com/

你可能感兴趣的文章
python操作数据库-安装
查看>>
vs.net删除转移文件
查看>>
你真的了解interface和内部类么
查看>>
java中常用的类型转换
查看>>
【log4j】使用Log4j?,slf4j更轻巧高效
查看>>
第三章 创建命令
查看>>
kuangbin专题七 POJ3264 Balanced Lineup (线段树最大最小)
查看>>
JS动画效果链接汇总
查看>>
父类转为子类涉及到的安全问题
查看>>
网络流,流水线模拟
查看>>
知识点笔记
查看>>
陈云川的OPENLDAP系列
查看>>
django 模型-----自连接
查看>>
P1197 [JSOI2008]星球大战
查看>>
将某个目录下的 文件(字符窜) 只将数字过滤出来
查看>>
urllib模块
查看>>
XML转义字符
查看>>
【vue】vue +element 搭建及开发中项目中,遇到的错误提示
查看>>
微信小程序之简单记账本开发记录(六)
查看>>
死锁和活锁
查看>>