webuploader上傳資料夾
在Web應用系統開發中,檔案上傳和下載功能是非常常用的功能,今天來講一下JavaWeb中的檔案上傳和下載功能的實現。
先說下要求:
PC端全平臺支援,要求支援Windows,Mac,Linux
支援所有瀏覽器。
支援檔案批量上傳
支援資料夾上傳,且要求在服務端保留層級結構。資料夾數量要求支援到10W。
支援大檔案斷點續傳,要求重新整理瀏覽器,重啟瀏覽器,重啟電腦後仍然能夠繼續上傳。檔案大小要求能夠支援到50個G。
支援自動載入本地檔案,要求能夠自動載入指定的本地檔案。
支援檔案批量下載,要求不要在伺服器打包。因為50G的檔案在伺服器打包時間比較長。
支援資料夾下載,要求不要在伺服器打包,下載到本地後要求保留層級結構
檔案列表面板支援路徑導航,新建資料夾
對於檔案上傳,瀏覽器在上傳的過程中是將檔案以流的形式提交到伺服器端的,如果直接使用Servlet獲取上傳檔案的輸入流然後再解析裡面的請求引數是比較麻煩,所以一般選擇採用apache的開源工具common-fileupload這個檔案上傳元件。這個common-fileupload上傳元件的jar包可以去apache官網上面下載,也可以在struts的lib資料夾下面找到,struts上傳的功能就是基於這個實現的。common-fileupload是依賴於common-io這個包的,所以還需要下載這個包。
一、開發環境搭建
建立一個FileUploadAndDownLoad專案,加入Apache的commons-fileupload檔案上傳元件的相關Jar包,如下圖所示:
依賴jar包如下
二、實現檔案上傳
前臺HTML模板
檔案塊處理邏輯如下
儲存檔案塊邏輯如下
web.xml配置如下
執行效果如下:
檔案面板邏輯
前臺程式碼
2.3、檔案上傳的細節
上述的程式碼雖然可以成功將檔案上傳到伺服器上面的指定目錄當中,但是檔案上傳功能有許多需要注意的小細節問題,以下列出的幾點需要特別注意的
1、為保證伺服器安全,上傳檔案應該放在外界無法直接訪問的目錄下,比如放於WEB-INF目錄下。
2、為防止檔案覆蓋的現象發生,要為上傳檔案產生一個唯一的檔名。
3、為防止一個目錄下面出現太多檔案,要使用hash演算法打散儲存。
4、要限制上傳檔案的最大值。
5、要限制上傳檔案的型別,在收到上傳檔名時,判斷後綴名是否合法。
針對上述提出的5點細節問題,我們來改進一下UploadHandleServlet,改進後的程式碼如下:
檔案資料表結構
資料夾資料表結構
下載資料表結構
針對上述提出的5點小細節問題進行改進之後,我們的檔案上傳功能就算是做得比較完善了。
三、檔案下載
載入檔案列表,注意,這裡只列出上傳完的檔案和資料夾,沒有上傳完的就不列出了
資料庫的處理邏輯比較簡單,注意一下SQL語句中的條件即可
我們要將Web應用系統中的檔案資源提供給使用者進行下載,首先我們要有一個頁面列出上傳檔案目錄下的所有檔案,當用戶點選檔案下載超連結時就進行下載操作,編寫一個ListFileServlet,用於列出Web應用系統中所有下載檔案。
檔案列表載入邏輯
這裡簡單說一下ListFileServlet中listfile方法,listfile方法是用來列出目錄下的所有檔案的,listfile方法內部用到了遞迴,在實際開發當中,我們肯定會在資料庫建立一張表,裡面會儲存上傳的檔名以及檔案的具體存放目錄,我們通過查詢表就可以知道檔案的具體存放目錄,是不需要用到遞迴操作的,這個例子是因為沒有使用資料庫儲存上傳的檔名和檔案的具體存放位置,而上傳檔案的存放位置又使用了雜湊演算法打散存放,所以需要用到遞迴,在遞迴時,將獲取到的檔名存放到從外面傳遞到listfile方法裡面的Map集合當中,這樣就可以保證所有的檔案都存放在同一個Map集合當中。
編寫一個用於處理檔案下載的Servlet,DownLoadServlet的程式碼如下:
檔案管理器主要邏輯如下:
檔案管理器所有的邏輯都在PageFileMgr.java中實現。
另外,檔案管理器有一些相關的配置在data目錄下
系統配置資料如下
路徑配置如下
檔案管理器的指令碼處理全部放在index.js中
關於JavaWeb中的檔案上傳和下載功能的內容就這麼多。
更詳細原始碼可以網上搜索“up6”即可
歡迎入群一起討論:374992201