chunkupload文件上傳斷點續傳組件(java)

来源:http://www.cnblogs.com/iyangyuan/archive/2016/09/25/5906296.html
-Advertisement-
Play Games

chunkupload簡介 chunkupload是一款基於java語言的斷點續傳組件,針對文件上傳,非文件下載,集成方便,使用簡單。 從整體上講,chunkupload會對文件進行切片處理,每個切片4M大小,預設情況下,chunkupload不會對切片進行合併,筆者也不建議在上傳文件時對切片進行合 ...


chunkupload簡介

 

     chunkupload是一款基於java語言的斷點續傳組件,針對文件上傳,非文件下載,集成方便,使用簡單。

     從整體上講,chunkupload會對文件進行切片處理,每個切片4M大小,預設情況下,chunkupload不會對切片進行合併,筆者也不建議在上傳文件時對切片進行合併,雖然chunkupload支持這項操作。

     對於客戶端(瀏覽器)而言,chunkupload組件會在客戶端計算文件MD5,為了儘可能提高計算效率,chunkupload在客戶端腳本中使用了web worker,因此,客戶端相容性會受到較為嚴重的影響。

     對於服務端而言,通過文件MD5+文件大小,唯一確定一個文件,並且基於文件MD5前6位,每兩位作為一級目錄,自動生成分散的目錄結構,假如文件MD5為[071287fffa974b878732a7a17858be36],那麼生成的目錄結構如下:[自定義的rootpath] + [/07/12/87/] +[文件MD5+文件長度]。文件目錄下的文件結構如下圖:

        

     其中,文件信息中包含:文件狀態(是否上傳完成)、文件MD5、文件大小、切片數量、每一個切片的序號+MD5信息。

     目前chunkupload通過servlet實現與瀏覽器的交互,完成了基於瀏覽器的斷點續傳,實際上,使用者完全可以調用chunkupload核心類庫自行操作文件,比如切片合併操作。

     總的來說,chunkupload具有如下特性:

 

         · 實現斷點續傳。

         · 對於同一個文件,允許多用戶上傳,並且上傳的用戶越多,上傳越快。

         · 線程安全。

         · 進程安全(同一物理機,非集群環境)。

 

     由於chunkupload目前還處於測試階段,過多的技術細節,筆者說多了也是白費,為了不做井底之蛙,公佈chunkupload有如下幾個期望:

 

         · 確定當前的模式是否符合大眾需求。

         · 確定是否有可能用於生產環境。

         · 確定是否存在潛在的不可行因素。

         · 積極改進chunkupload。

 

     總之,希望大家能給我一些建議,筆者水平有限,希望chunkupload最終能成為一個優秀的開源項目。

         

感受一下chunkupload使用方法

 

服務端

 

     引用chunkupload.jar包,chunkupload.jar無任何第三方依賴。

     在項目web.xml中配置chunkupload servlet。

 

1 <servlet>
2     <servlet-name>ChunkUpload</servlet-name>
3     <servlet-class>com.iyangyuan.chunkupload.servlet.DispatcherServlet</servlet-class>
4 </servlet>
5 <servlet-mapping>
6     <servlet-name>ChunkUpload</servlet-name>
7     <url-pattern>/chunkupload/*</url-pattern>
8 </servlet-mapping>

 

客戶端(瀏覽器)

 

     引用dawn.js,用於計算文件MD5,dawn.js算是chunkupload的一個附屬項目。

     引用chunkupload.js,用於與服務端進行交互,chunkupload.js核心思想是只關註交互,不關註具體UI展現,因為各個產品UI不盡相同,chunkupload.js不對UI做過多限制、干擾。

     無任何第三方依賴。

 

  1 <html>
  2     <head>
  3         <title>ChunkUpload 文件上傳示例</title>
  4         <meta charset="utf-8">
  5         <meta name="viewport" id="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">
  6         <style>
  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             }
 27             body > div.form > input.button {
 28                 font-size: 15px;
 29                 line-height: 29px;
 30                 padding: 0 10px;
 31             }
 32             body > div.form > input:hover {
 33                 background-color: #f5f5f5;
 34             }
 35             div.info > div{
 36                 margin: auto;
 37                 height: 31px;
 38                 width: 88px;
 39                 background: url('data:image/gif;base64,R0lGODlhWAAfAMMBAAAAAP////XcoPDLdfTboP+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;
 40                 padding: 2px;
 41                 box-sizing: border-box;
 42             }
 43             div.info > div > p{
 44                 text-align: right;
 45                 font-size: 12px;
 46                 margin: 0;
 47             }
 48         </style>
 49     </head>
 50     <body>
 51         <!-- 表單部分 -->
 52         <div class="form">
 53             <input id="bigFile" type="file" placeholder="選擇一個文件" />
 54             <input id="execBtn" class="button" type="button" value="上傳" />
 55         </div>
 56         <!-- 上傳進度展示 -->
 57         <div class="info">
 58             <div>
 59                 <!-- 提示文本 -->
 60                 <p id="text"></p>
 61                 <!-- 執行進度 -->
 62                 <p id="progress"></p>
 63             </div>
 64         </div>
 65     </body>
 66     <script src="/static/lib/dawn/dawn.js"></script>
 67     <script src="/static/lib/chunkupload/chunkupload.js"></script>
 68     <script>
 69         var fileInput = document.getElementById("bigFile"),
 70             execBtn = document.getElementById("execBtn"),
 71             text = document.getElementById("text"),
 72             progress = document.getElementById("progress");
 73         
 74         execBtn.addEventListener("click", function(e) {
 75             var file, cu;
 76             file = fileInput.files[0];
 77             cu = new ChunkUpload(file);
 78             cu.upload({
 79                 "success": function(block){
 80                     /**
 81                      * 上傳成功後,會返回一個block對象
 82                      * 通過block對象,可以在一定程度上管理文件,目前支持:
 83                      * 獲取文件信息(參見info_example.html)
 84                      * 刪除文件(參見delete_example.html)
 85                      */
 86                     text.innerText = "上傳完成";
 87                 },
 88                 "error": function(e){
 89                     text.innerText = e;
 90                     progress.innerText = "";
 91                 },
 92                 "md5Progress": function(n){
 93                     text.innerText = "計算MD5";
 94                     progress.innerText = n + "%";
 95                 },
 96                 "uploadProgress": function(n){
 97                     text.innerText = "正在上傳";
 98                     progress.innerText = n + "%";
 99                 }
100             });
101         });
102     </script>
103 </html>

     

     通過以下四個回調,與UI進行交互,完成文件上傳。

 

         ·success上傳成功回調

         ·error 異常回調

         ·md5Progress MD5計算進度回調

         ·uploadProgress 上傳進度回調

 

      目前項目基本完成,註釋詳盡,發佈指日可待~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在剛學習SpringMVC框架整合時,你也許會產生疑問為什麼Spring.xml和SpringMVC.xml中都有註解過濾。 <context:component-scan base-package="myproject"> 和<context:component-scan base-package ...
  • 前言 最近要找工作,免不得要有一番筆試,今年好像突然就都流行線上筆試了,真是搞的我一塌糊塗。有的公司呢,不支持Python,Java我也不會,C有些數據結構又有些複雜,所以是時候把STL再看一遍了…不會告訴你距離上次使用可能已經有半年以上了。 STL是什麼 STL為C++的標準模版庫,又稱為C++泛 ...
  • 20160923 定義:將一個類的定義放在另一個類的內部; 從外部類的非靜態方法之外,創建某個內部類的對象:OutClassName.InnerClassName; 內部類擁有所有其外部類的成員的訪問權; 成員內部類不能含有static修飾的變數和方法,因為成員內部類需要先創建了外部類,才能創建它自 ...
  • SpringMVC又一個漂亮的web框架,他與Struts2並駕齊驅,Struts出世早而占據了一定優勢,下麵同樣做一個簡單的應用實例,介紹SpringMVC的基本用法,接下來的博客也將梳理一下Struts2和SpringMVC的一些異同,通過梳理和舊知識的聯繫,讓學習的成本變低,花很短的時間就可以 ...
  • 分別使用序數和enummap的結果: 序數: test1() 使用enummap,tes1t ...
  • 1. Python 文件I/O 本章只講述所有基本的的I/O函數,更多函數請參考Python標準文檔。 2.列印到屏幕 最簡單的輸出方法是用print語句,你可以給它傳遞零個或多個用逗號隔開的表達式。此函數把你傳遞的表達式轉換成一個字元串表達式,並將結果寫到標準輸出如下: 示例1: 運行示例1結果如 ...
  • 【應用場景】:熱門標簽、推薦 【特點】: 在佈局內,隨意擺放任意個view,每行所擺放的view個數,根據實施計算出來的寬度,一旦當前要擺放的view寬度和之前擺放的所有view寬度加在一起,超過了佈局的寬度,那麼就把該view換行擺放。 【佈局】: <LinearLayout xmlns:andr ...
  • maven作為一個項目構建工具,在開發的過程中很受歡迎,可以幫助管理項目中的bao依賴問題,另外它的很多功能都極大的減少了開發的難度,下麵來介紹maven的安裝及與eclipse的集成。 maven的官網地址為:http://maven.apache.org/,打開網頁之後,看到最新的版本是3.3. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...