java 断点续传组件_chunkupload 文件上传断点续传组件(java) - 正式发布
chunkupload簡(jiǎn)介
chunkupload是一款基于java語(yǔ)言的斷點(diǎn)續(xù)傳組件,針對(duì)文件上傳,非文件下載,集成方便,使用簡(jiǎn)單。
chunkupload實(shí)現(xiàn)如下功能:
·? 實(shí)現(xiàn)斷點(diǎn)續(xù)傳
·? 對(duì)于同一個(gè)文件,允許多用戶(hù)同時(shí)上傳,并且上傳的用戶(hù)越多,上傳越快
·? 線(xiàn)程安全
·? 同一物理機(jī)下進(jìn)程安全
·? 文件自動(dòng)切片,支持合并
·? 內(nèi)存占用小
·? 高效穩(wěn)定,高可用
·? 易集成,無(wú)第三方依賴(lài)
chunkupload只關(guān)注文件上傳,并沒(méi)有安全機(jī)制,開(kāi)發(fā)者需要自行設(shè)計(jì)安全控制策略,防范用戶(hù)上傳非法文件,chunkupload默認(rèn)上傳的文件是安全的。
chunkupload功能完備,服務(wù)端和客戶(hù)端無(wú)縫銜接,開(kāi)發(fā)者只需關(guān)注自身業(yè)務(wù)和UI展現(xiàn)即可。
為了盡可能提升用戶(hù)體驗(yàn),chunkupload在客戶(hù)端的技術(shù)選型有些激進(jìn),采用了許多先進(jìn)的技術(shù),比如:web worker、XMLHttpRequest數(shù)據(jù)傳送進(jìn)度、FileReader、file slice等,所以對(duì)瀏覽器兼容性會(huì)有一定影響,在確定使用chunkupload前請(qǐng)務(wù)必仔細(xì)斟酌!
chunkupload集成
服務(wù)端
chunkupload服務(wù)端運(yùn)行需要JRE7或更高版本,無(wú)任何第三方依賴(lài)。
1.引用chunkupload.1.0.jar。
2.在項(xiàng)目web.xml中配置chunkupload servlet。
1
2 ChunkUpload
3 com.iyangyuan.chunkupload.servlet.DispatcherServlet
4
5
6 ChunkUpload
7 /chunkupload/*
8
強(qiáng)烈建議將chunkupload servlet配置在安全框架之后(比如shiro),mvc框架之前(如springmvc)。
chunkupload servlet中的攔截路徑(url-pattern),如果無(wú)特殊需求,無(wú)需更改,假如一定要更改,還需要同步更改客戶(hù)端的配置。
客戶(hù)端
chunkupload客戶(hù)端對(duì)瀏覽器的要求比較高,目前已知chrome、firefox瀏覽器完整支持,360瀏覽器如果啟用webkit內(nèi)核,應(yīng)該也沒(méi)有問(wèn)題,IE瀏覽器絕對(duì)不支持(想都不要想),其他瀏覽器未知。
開(kāi)發(fā)者可能會(huì)問(wèn),為什么兼容性如此捉襟見(jiàn)肘?
chunkupload是新時(shí)代的產(chǎn)物,它代表了時(shí)代的發(fā)展方向,它的價(jià)值在于提供最先進(jìn)的技術(shù)示范,而不是沉重的歷史包袱。
chunkupload在客戶(hù)端的實(shí)現(xiàn),無(wú)任何第三方依賴(lài),只關(guān)注與服務(wù)端的邏輯交互,并不干預(yù)UI展現(xiàn),為開(kāi)發(fā)者創(chuàng)造最大的發(fā)揮空間。
1.引用dawn.1.0.js,用于在客戶(hù)端計(jì)算文件MD5,dawn.js是chunkupload的一個(gè)附屬項(xiàng)目,相比未經(jīng)優(yōu)化的javascript計(jì)算MD5方法,dawn.js將計(jì)算效率提升50%左右。
2.引用chunkupload.1.0.js,此乃chunkupload客戶(hù)端核心庫(kù),封裝了所有上傳所需的邏輯。
chunkupload使用
服務(wù)端
服務(wù)端需要?jiǎng)?chuàng)建chunkupload.properties配置文件,放置在項(xiàng)目classpath根目錄下,也就是大家熟悉的log4j.properties所在目錄,配置文件中有如下選項(xiàng):
·??root 文件存儲(chǔ)路徑,相當(dāng)于根目錄,內(nèi)部還會(huì)有chunkupload創(chuàng)建的目錄結(jié)構(gòu);假如同一臺(tái)物理機(jī)配置多個(gè)文件上傳容器,此項(xiàng)配置應(yīng)該設(shè)置成統(tǒng)一目錄,默認(rèn)為[/data]。
·??fileLockCapacity文件鎖緩存容量,一般設(shè)置為2048即可,開(kāi)發(fā)者可根據(jù)服務(wù)器性能自行調(diào)整,默認(rèn)為2048。
·??createFile 文件上傳完成后,是否立即合并切片,生成完整文件;強(qiáng)烈建議此配置項(xiàng)設(shè)置為false,一般情況下,切片無(wú)需合并,就算合并,也不需要立即合并;如果設(shè)為true,立即合并文件會(huì)占用大量服務(wù)器資源,并且會(huì)造成客戶(hù)端長(zhǎng)時(shí)間等待;合并的速度大約100M/S,視服務(wù)器具體性能而定,默認(rèn)為true。
至此,服務(wù)端已經(jīng)可以正常運(yùn)作了。
客戶(hù)端
默認(rèn)情況下,客戶(hù)端無(wú)需任何配置。
假如開(kāi)發(fā)者更改過(guò)chunkupload servlet攔截路徑,那么chunkupload.1.0.js中的Block.config.api配置也需要做相應(yīng)的改動(dòng),具體情況需要開(kāi)發(fā)者自行斟酌。
ChunkUpload 類(lèi)
文件上傳核心實(shí)現(xiàn)類(lèi)。
實(shí)例化
上傳組件初始化需要提供目標(biāo)文件。
1 /**2
3 * 實(shí)例化ChunkUpload組件4
5 * file 要上傳的目標(biāo)文件對(duì)象6
7 */
8
9 var cu = new ChunkUpload(file);
upload 方法
upload 方法用來(lái)啟動(dòng)文件上傳,通過(guò)四個(gè)異步回調(diào)完成上傳交互,無(wú)返回值。
1 cu.upload({2 "success": function(block){3 /**4 * 上傳成功回調(diào)5 *6 * block 對(duì)象,塊對(duì)象7 */
8 },9 "error": function(e){10 /**11 * 上傳異常回調(diào)12 *13 * e 字符串,異常信息14 */
15 },16 "md5Progress": function(n){17 /**18 * 計(jì)算文件md5進(jìn)度回調(diào)19 *20 * n 整型,進(jìn)度數(shù)值21 */
22 },23 "uploadProgress": function(n){24 /**25 * 上傳進(jìn)度回調(diào)26 *27 * n 整型,進(jìn)度數(shù)值28 */
29 }30 });
abort方法
abort方法用來(lái)中斷上傳,可以在任意階段任意時(shí)刻中斷,無(wú)返回值。
1 cu.abort();
Block 類(lèi)
文件控制類(lèi)。
實(shí)例化
1 /**2
3 * 初始化塊對(duì)象4
5 * md5 文件md5,32位6
7 * size 文件大小,字節(jié)8
9 */
10
11 var block = new Block(md5, size);
info方法
獲取塊(文件)信息,返回javascript對(duì)象。
1 block.info();
返回示例:
1 {2
3 "status": 0, //業(yè)務(wù)狀態(tài),0表示成功
4
5 "data": { //數(shù)據(jù)域
6
7 "chunks": [ //所有切片信息
8
9 {10
11 "md5": "e114c21f7d9f8ad1a8551225c3d085be", //切片md5
12
13 "n": 1 //切片序號(hào)
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, //切片數(shù)量
52
53 "md5": "f1154ca6fab7f3628927c1268f3570fd", //文件md5
54
55 "state": 1, //文件狀態(tài),1為上傳完成
56
57 "size": 20879935 //文件長(zhǎng)度
58
59 }60
61 }
delete方法
刪除塊(文件) ,無(wú)返回值。
1 block.delete();
chunkupload服務(wù)端存儲(chǔ)珠璣
任何上傳的文件都會(huì)在服務(wù)端進(jìn)行切片處理,每個(gè)切片4M大小。
通過(guò)文件MD5和文件大小,唯一確定一個(gè)文件。
目錄分散策略,基于開(kāi)發(fā)者自定義的rootpath,文件MD5前6位,每?jī)晌蛔鳛橐患?jí)目錄,最后以文件MD5+文件長(zhǎng)度作為最終目錄,所有文件信息均存儲(chǔ)在此目錄下。
假如文件MD5為[071287fffa974b878732a7a17858be36],長(zhǎng)度為[20879935],開(kāi)發(fā)者自定義的rootpath為[/data],那么生成的目錄結(jié)構(gòu)為:[/data/07/12/87/071287fffa974b878732a7a17858be3620879935]。
chunkupload存儲(chǔ)的關(guān)于文件的所有信息,均為二進(jìn)制文件,并且文件名稱(chēng)固定,具體組織如下圖:
chunkupload未來(lái)
展望chunkupload,未來(lái)無(wú)疑是開(kāi)源的,只不過(guò)現(xiàn)在還不是時(shí)候,因?yàn)樽髡哂X(jué)得它還不夠完美。
通過(guò)大家的寶貴意見(jiàn)、建議,作者會(huì)不斷完善、改進(jìn)chunkupload,等到chunkupload成熟時(shí),也就是開(kāi)源之日!
希望大家多多與我交流~
chunkupload組件下載
你可以下載如下內(nèi)容:
·chunkupload.jar
·chunkupload.js
·dawn.js
·腳手架(集成了chunkupload的空白項(xiàng)目)
附:客戶(hù)端使用示例
上傳示例
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
總結(jié)
以上是生活随笔為你收集整理的java 断点续传组件_chunkupload 文件上传断点续传组件(java) - 正式发布的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java校验文件格式_Java 判断文件
- 下一篇: java继承对象转换_java中类与对象