在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中的文件上傳和下載功能的內容就這么多。
最終實現的效果如下:
文件批量上傳
文件批量下載
路徑導航