孫詩軍,段元梅
(湖南科技學院 信息工程學院,湖南 永州 425199)
隨著當今計算機技術與互聯網技術的高速發展,現代社會正以不可想象的速度產生各種各樣的數據,根據IDC 預測,全球數據量將由2016 年的16.1ZB 增長至2025 年的163.0ZB。在這種情況下,云端存儲逐漸地體現出了其優越性。云盤的數據是存放在云端的服務器上的,用戶要使用到云盤的數據服務就必須以互聯網為入口,訪問互聯網的最簡單的方式就是通過Web 瀏覽器。B/S 架構的主要特點是分布性強,維護、開發方便,本文所做的網盤系統就是基于B/S 架構,以實現一款實用、可靠、可擴展的輕量級網盤為目標[1]。
用戶模塊主要是對自己的賬號擁有注冊、登錄、修改密碼的功能,新用戶的密碼要加密存儲在后臺。在用戶注冊完成時網盤系統要為新的用戶分配兩塊權限不同的文件空間,加以私有/公開的權限控制,私有空間中的文件和目錄只有自己能查看修改,公有空間中的文件和目錄可以分享給他人查看并下載。用戶的賬號要有存儲空間的限制,不能無限制地向網盤上傳文件[2]。
在文件模塊,最重要的功能是上傳文件。要保證用戶的使用體驗,就要具備上傳速度快的特性,上傳中的文件需要有暫停的功能,并且由于網絡的不穩定性,很有可能發生文件上傳到一半就失敗的情況,因此要能夠支持斷點續傳功能。對于硬件設備來說,重復的文件會降低空間利用率,上傳的文件必須能夠去重,相同的文件保證在服務器端只存儲一份[3]。
目錄模塊,是用戶對于自己網盤中的文件以及目錄,需要有創建、刪除、移動、重命名功能。用戶訪問目錄要能像在電腦上訪問文件夾一樣,頁面以列表的方式顯示出目錄下的子目錄、文件,能對列表中的目錄和文件進行操作,還要有一條能夠進行目錄導航的路徑,點擊路徑上的目錄進行目錄跳轉[4]。
1.2.1 注冊
前臺需要傳入用戶名、密碼、郵箱字段。初始化用戶的屬性,為用戶分配初始的私有空間根目錄和公有空間根目錄。設置密碼方面,為了保證用戶的密碼以密文形式存儲,需要進行加鹽加密,使用當前時間戳作為鹽值,為用戶的密碼進行加密。如果前臺傳入的用戶名或郵箱在數據庫中有重復,前臺需要有相應的提示。注冊成功后,頁面跳轉到登錄頁面。
1.2.2 登錄
前臺需要傳入用戶名、密碼字段。后臺需要進行兩次校驗,分別是校驗用戶的賬號是否存在,賬號密碼是否匹配。驗證密碼時,需要從數據庫中取出該用戶注冊時使用的鹽值,對前臺傳進來的明文密碼進行加密,然后再與數據庫中的密文比對。登錄失敗時,前臺要有相應的提示,登錄成功后,頁面跳轉道網站的首頁。
1.3.1 訪問目錄
前臺需要傳入一個目錄的ID,后臺需要返回給前臺當前目錄的路徑信息,以及當前目錄下的所有文件和目錄。后臺拿到前臺傳過來的目錄ID 后,去數據庫中的DIR 表找到該ID 對應的記錄,如果找不到需要報錯。如果能找到,使用pDirId 字段遞歸查找到根目錄,得到該目錄的路徑。在DIR 表和USER_FILE 表中使用目錄id 以及當前用戶ID 找出當前目錄下所有目錄和文件。
1.3.2 創建目錄
前臺需要傳入當前目錄的ID,新目錄的目錄名,在當前目錄下創建一個新的目錄。后臺首先對目錄名進行格式校驗,如果有非法字符則創建失敗并返回錯誤信息給前臺。若目錄名沒有問題,將當前目錄的ID 作為新目錄的pDirId,記錄創建用戶的ID,存入數據庫。新目錄的權限跟隨父目錄及當前目錄的權限。
1.3.3 目錄重命名
目錄重命名功能在點擊重命名按鈕后,打開Bootstrap 提供的Modal 窗口,綁定目錄ID 參數為一個表單參數,輸入新的目錄名后,點擊確認按鈕,提交目錄ID 和新目錄名到后臺。與創建目錄一樣,后臺對新的目錄名也進行格式校驗。校驗通過后,拿到目錄的ID,找到數據庫中對應的記錄,更改DIR_NAME 字段即可。
1.3.4 刪除目錄
因為此操作不可恢復,刪除目錄后會連帶目錄下的所有文件一起刪除,因此在調用后臺接口前,需要彈出二次確認的提示。調用接口后,前臺向后臺傳入刪除的目錄的ID。后臺要在DIR 表中遞歸刪除該目錄下所有的子目錄,并且在刪除子目錄的過程中要刪除掉USER_FILE 表中子目錄下的文件。后臺執行完后,前臺跳轉到之前所在目錄。刪除的文件,只在數據庫里取消與用戶的關聯,并不在硬盤上將文件真的刪掉。通過每周一次的輪詢,將硬盤上與用戶關聯數為零的文件刪除。
1.4.1 上傳文件
這個功能是本項目中需要研究的一個重點。首先將上傳文件的關鍵點和可能遇到的一些問題列出來:如何提高上傳的速度,怎樣判斷上傳的文件數據中心是否已存在,傳輸到一半網絡異常要如何解決。第一,解決提高文件上傳的速度問題。文件的上傳分為兩個步驟,第一個階段是在前端對文件進行MD5 序列化,獲取文件的MD5 值,這個在后面的文件判重時需要用到。第二個階段是將文件上傳至服務器。對于文件上傳速度的優化,就可以從這兩個階段入手。
對于第一個階段,對數據量不大的小文件進行MD5計算是比較快的,通常在幾秒內就能完成,但對于100 MB 以上的文件,計算其MD5 值就很慢了。通過測試一個300 MB 的文件,發現對其進行MD5 加密的總用時超過了2 分鐘,如果文件再大一些,用時還會更長。
對于第二階段來說,要優化上傳的速度,可以采取提高上傳并發量這一策略,這一策略主要可以加快大文件的上傳速度。在前端使用JavaScript 腳本,對即將上傳的文件進行分片,上傳的過程中可以通過并發的方式,同時上傳多個分片,并且每個分片都要加上當前是第幾塊分片這一參數,服務器在接收到這些分片后,對其進行組裝,還原成上傳的文件。
1.4.2 刪除文件
前端向后臺傳遞一個文件ID 參數,后臺在USER_FILE 表中對對應的記錄進行刪除,同時更新USER 表中的SIZE_USED 字段。因為同一個FILE 可能被多個用戶所引用,因此通過一個每周一次的輪詢,檢查FILE表中如果有的記錄被USER_FILE 表引用的次數為0,就刪除這條記錄,并且刪除對應的存儲文件,釋放空間。
通過對每個功能模塊、前端的顯示、邊界數據的檢測、數據庫的數據正確性進行測試,測試結果表明該項目所完成的功能均能正常運行。
本文完成了基于Java 的網盤系統設的設計與實現。針對上傳這一功能不夠完善的缺點,設計了一個方便實用的網盤系統。該網盤前端使用Bootstrap、WebUploader 兩款插件,通過Bootstrap 的柵格系統、內置樣式進行頁面的布局以及美化,通過WebUploader 配置了文件分片上傳,完成文件上傳的暫停、續傳、秒傳功能在前端的實現。后臺使用SpringBoot 進行快速搭建,以Mysql 作為數據庫,通過Mybatis 框架將Java 中的實體類與數據庫的表進行映射,最終實現了所設計的網盤系統。