摘要:B/S應用系統中,文件上傳功能十分常見。目前在處理大文件上傳時,經常因內存泄漏導致網頁卡頓、使用單線程上傳文件效率低、未采用斷點續傳因網絡中斷導致重新上傳等問題。在網頁端使用SparkMD5對大文件進行分片上傳,并利用SHA-512算法進行簡易數據簽名、MD5值實時校驗文件分片的完整性,實現了大文件上傳進度顯示與分片實時校驗功能,有效解決了大文件上傳時的網頁等待超時及文件數據完整性保障問題。
關鍵詞:大文件分片上傳;SparkMD5;數據簽名;實時校驗
中圖分類號:TP311" " " 文獻標識碼:A
文章編號:1009-3044(2025)17-0045-03
開放科學(資源服務) 標識碼(OSID)
0 引言
B/S系統中,文件上傳功能很常見,例如在異地備份系統中批量上傳學生檔案圖片、批量上傳學校教學、科研數據等[1]。常見的文件上傳功能多采用HTML表單或Ajax技術實現,這些文件上傳方案實現原理簡單[2],使用非常方便,但在使用過程中存在以下問題:1) 在網絡不穩定時,因網絡中斷導致上傳失敗;2) 文件通常以文件流(FileOutputStream) 的方式接收,文件過大會導致服務器與瀏覽器內存溢出、服務崩潰[3],無法完成文件上傳;3) 文件上傳中斷后,服務端已接收的部分數據通常難以復用,導致需要完整重傳,這大大降低了上傳速率。為解決上述問題,提出了基于SparkMD5的大文件分片上傳與實時校驗的方法,對上傳的文件進行分片上傳并實時校驗,既能解決服務器與瀏覽器內存溢出的問題[4],又能實時校驗文件分片完整性,保障大文件上傳時的網頁等待超時及數據完整性問題[5]。
1 大文件分片上傳與實時校驗方法設計
分片上傳大文件的主要問題在于如何確定文件分片尺寸。文件分片太大會導致單個分片上傳時間長,且在文件分片傳輸過程中出現問題時,需要客戶端重新傳輸文件分片,從而降低文件整體的傳輸效率;文件分片過小則會導致客戶端頻繁發送文件分片和計算文件數據簽名,服務端也需要花費較多時間進行文件數據簽名驗證及文件數據的分片組合,這也會降低傳輸效率。
結合磁盤I/O效率的考慮,文件分片設置為4 KB整數倍時,磁盤存儲效率最高?;跐洗髮W信息管理處云存儲系統進行多次實驗,將文件分片大小設置為2 MB時,文件分片不會太多,服務端處理文件分片消耗資源較少,可以顯著提升性能[6]。
文件分片數計算方法為用待上傳的文件尺寸除以文件分片大小,且需要向上取整。文件上傳進度使用列表(List) 進行記錄,其中每條記錄則使用哈希映射(HashMap) 進行記錄,服務端維護的列表記錄各分片狀態,每條記錄包含分片序號、分片MD5值、是否已上傳及文件分片信息。同時,每個傳輸的數據包都通過Secure Hash Algorithm 512-bit(以下簡稱SHA-512) 計算其哈希值,用于校驗數據完整性。
服務端對上傳進度進行維護,若文件上傳期間出現異常,再次上傳文件時,服務器接收到的信息先進行數據包完整性校驗[7],驗證通過后,再對比該文件分片的MD5值是否與服務端記錄的狀態信息一致(用于斷點續傳檢查) 。若MD5值一致,則直接上傳下一分片;若MD5不一致,則須重新上傳該文件分片,直到文件上傳完畢。
2 大文件分片上傳與實時校驗方法設計和實現
2.1 大文件分片上傳前端實現
?SparkMD5是一款通過分塊計算與增量處理大文件、占用內存少的高效計算MD5哈希算法的JavaScript庫,能夠用于檢測文件的完整性或進行數據的簽名。它可以在瀏覽器環境中運行,無須后端服務支持,提供了一種簡單、快速的方法來計算哈希值。與其他類似庫相比,SparkMD5具有性能優越、易于使用及支持大文件等優點。
客戶端首先向服務端發起請求,核驗待上傳文件的MD5值是否在服務器中已經存在,若文件MD5值存在,說明服務端已存在該文件,并提示秒傳完畢。若不存在,則開始上傳文件,對選中的文件進行分片,方便后續計算文件分片的MD5[8]。Blob.slice(start, end)在字節范圍切割Blob數據,返回新Blob,用于分片上傳、斷點續傳等場景;其中start為當前文件切片開始位置,end為當前文件切片結束位置。計算每個分片及整個大文件的MD5值;客戶端對大文件進行分片后,將分片序號、分片MD5值、是否已上傳及文件分片信息同時使用SHA-512計算上述數據包哈希值,逐一上傳至服務端;直到所有分片上傳完畢后,發出文件合并校驗整體MD5請求;服務端校驗成功后反饋上傳成功消息,文件上傳完成[9],前端關鍵處理代碼如圖1所示。
2.2 分片上傳服務器端實現
服務端針對客戶端上傳文件請求時,先校驗客戶端發來的文件MD5值是否存在,若MD5值存在,則說明該文件已上傳至服務器,直接反饋上傳成功的消息并進行后續操作。
若文件不存在(MD5值未匹配) ,則通知客戶端開始上傳文件分片。首先接收客戶端上傳的分片序號、分片MD5值、是否已上傳及文件分片信息及數據包哈希值,使用SHA-512算法計算數據包的哈希值與文件分片的MD5值。先使用服務端計算的哈希值與客戶端的哈希值對比通過后,再校驗服務端與客戶端上傳的文件分片的MD5值是否一致。校驗通過后,創建文件切片目錄,使用文件分片MD5值命名保存文件分片。當所有分片上傳完成后,合并文件分片,計算合并后完成后的文件MD5,并與客戶端發來的整個文件MD5對比一致后,記錄已上傳文件的MD5及相關信息,向客戶端反饋上傳成功。
服務器端處理文件分片合并的方法有兩種:一種是先接收所有文件分片后,再進行文件分片的校驗與合并操作。服務器先接收所有文件分片數據,當所有文件分片全部接收完畢后,開始檢查文件分片的完整性,檢查通過后集中處理文件分片的合并。服務器按照文件分片順序完成合并,待所有文件合并成功后,統一刪除臨時文件。若文件尺寸較大,服務器在接收文件分片時會產生大量臨時文件,且校驗及合并文件分片的過程煩瑣且耗時,易導致用戶等待時間較長,且經常出現網頁響應超時的現象。
第二種方法是在傳輸文件分片數據的過程中同時進行數據校驗與合并文件分片。服務端每接收一個數據包后立刻進行數據校驗與數字簽名檢測,檢測通過后直接對文件分片進行合并操作;當前分片合并完成后再接收下一個文件分片,直到文件合并完成后再刪除所有文件分片。邊傳輸文件分片邊合并的方法解決了客戶端長時間等待的問題。在服務端實時監測分片傳輸完整性的同時,采取實時合并文件分片的操作,降低客戶端等待響應時間,同時保留所有文件分片,確保最終文件合并成功,提高了Web端大文件斷點續傳的使用體驗。
客戶端采用AJAX提交的方式不斷向后臺傳輸數據,客戶端傳輸到服務端的數據有以下三種:第一種是開始數據,向服務端提交客戶端開啟傳輸數據,并約定在本次傳輸過程中確定用戶、文件名、文件尺寸和整個文件的MD5值。服務端根據文件MD5值進行搜索,若待上傳文件的MD5值存在,則說明服務端已存在該文件,直接提示上傳完畢,并做好相應記錄;若服務端不存在該MD5值,則返回上傳標志,通知客戶端開啟分片上傳工作。
第二種是文件數據,向服務端說明上傳的是文件分片數據。服務端在request中獲取到客戶端的數據,包括分片序號、分片MD5值、是否已上傳及文件分片信息及數據包哈希值后,立刻使用SHA-512算法計算數據包的哈希值,對比服務端的數據包哈希值與客戶端發送的哈希值是否一致。驗證通過后,將文件分片存儲到臨時文件;服務器計算臨時文件中保存的文件分片MD5值,并將計算得出的MD5值與request數據中獲取到的MD5值進行對比,若對比成功,則直接對文件分片進行合并操作,同時通知客戶端繼續上傳下一個文件分片;若計算得出的MD5值與request數據中獲取到的MD5值進行對比失敗,則通知客戶端重新上傳該文件分片,直至所有文件分片上傳完畢。
第三種是結束數據,客戶端收到來自服務端最后一個文件分片上傳成功的響應后,立刻向服務端發送文件傳輸結束信息;對整個文件進行MD5驗證,服務端計算后得到的整個文件MD5值與開始數據中的整個文件MD5值對比,若對比一致,則結束本次文件傳輸工作;若對比失敗,則須檢查所有文件分片是否均已傳輸至服務器,服務端重新合并文件分片,校對整個文件MD5值,確保文件合并成功。
3 實驗與分析
3.1 實驗過程
針對大文件上傳設計了實時校驗的方法,測試時均采用大文件進行上傳測試。選取多個尺寸不同的大文件,通過對網絡限速,在服務端發送不同比例(1%、5%、10%) 傳輸失敗數據,模擬不同質量的網絡環境下進行上傳測試。程序運行過程中,使用瀏覽器自帶調試工具進行統計測試結果。在測試工具面板中,通過對JavaScript代碼進行控制,設置斷點位置、上傳耗時與上傳進度。在網絡面板中,查看瀏覽器請求與服務端響應。選中的文件均測試多次,取平均值。測試過程中,使用Fatbeans工具截斷、修改數據包內容,模擬中斷網絡及數據攔截攻擊,以測試文件斷點續傳與實時校驗的功能。
通過多次系統測試,文件分片上傳、斷點續傳的功能均已實現。當文件分片為2 MB時,文件上傳處理的速度明顯優于其他文件分片大小,但將文件分片的尺寸調整為4 MB或8 MB時,處理大文件分片上傳時的效率優化不明顯。
3.2 實驗分析
測試網絡環境為校內千兆網絡,正常上行帶寬為10 MB/s。虛擬化服務器配置如下:CPU 16 核,內存為32 GB,硬盤空間為500 GB,操作系統為 Windows Server 2019,使用個人工作電腦進行測試,配置為CPU 6 核,Intel Core i5,內存為8 GB。客戶端采用多種主流瀏覽器進行多次上傳測試。
在大文件分片上傳時,文件分片尺寸為1 MB,導致請求次數較多,服務端處理每個分片的哈希值計算、MD5校驗、狀態更新及磁盤 I/O 累積時間增加;而4 MB和8 MB分片請求次數較少,但單次傳輸時間較長,網絡波動造成文件分片重傳影響較大,且前端計算數據包哈希值與文件分片MD5,后端校驗、合并單個大分片的時間也有所增加,綜合效率反而下降。當文件分片為2 MB時可達到系統開銷平衡,效率最高。本實驗最優值可能受網絡條件、服務器處理能力等因素影響。
考慮到實際運行情況,該次測試使用不同分片大小和不同分片方法,分別對4個不同大小的文件(102 MB、500 MB、1.5 GB、2.3 GB) 進行上傳,對比其上傳結果,取平均上傳時間(秒) ,測試結果如表1所示。
4 結論
使用大文件分片上傳的方法解決了網頁處理大文件上傳過程中內存溢出及頁面超時的問題。采用這種方式處理文件上傳,可以忽略文件大小,同時很好地實現大文件的斷點續傳,從而解決了瀏覽器處理大文件上傳的各種問題。
通過前端頁面使用SparkMD5提供的文件處理API實現大文件的分片上傳方式,有效解決了文件在前后端傳輸期間因網絡波動導致的傳輸失敗問題,以及文件過大導致瀏覽器和服務端中間件內存溢出的問題?;趯崟r校驗文件分片數據包哈希值及MD5值,并在合并完整文件分片的方法上,在服務器端接收文件分片及校驗的同時,文件分片的合并也會同步進行,既避免了所有文件分片上傳后再進行校驗與合并文件的操作時間過長,從而導致客戶端響應時間長與響應超時的問題,同時利用了服務端的高性能,節省了程序處理時間。
參考文獻:
[1] 周煜瑩,崔巖松,王丹志,等.基于自適應分片的大文件快速上傳[J].計算機系統應用,2022,31(7):143-148.
[2] 阮曉龍,李朋楠.基于Web的大文件高效上傳方法[J].計算機系統應用,2020,29(3):234-239.
[3] 王莉敏,梁正和,段全鋒.基于HTML5大文件斷點續傳的實現方案[J].計算機與現代化,2016(3):91-95.
[4] 廖藝咪.基于SSH2架構的FTP大文件上傳技術[J].電腦知識與技術,2015,11(22):37-39.
[5] 趙學孔,龍世榮.基于ASP.NET的大文件上傳模塊研究與實現[J].電腦知識與技術,2015,11(9):112-113.
[6] 鄒鶴敏,黃海于.大文件分塊上傳和下載軟件的設計與實現[J].電子技術應用,2013,39(8):137-139.
[7] 石寧琛,李小瑜.網頁應用中的大文件上傳軟件開發研究[J].企業科技與發展,2012(15):23-24,27.
[8] 康志輝.Web應用系統文件上傳漏洞分析[J].信息與電腦(理論版),2023,35(4):32-34.
[9] 唐文軍,隆承志.一種基于分片的斷點續傳方法的實現[J].電子設計工程,2023,31(23):26-30.
【通聯編輯:謝媛媛】