天天看點

JavaWeb 檔案 上傳 下載下傳

檔案上傳下載下傳對于一個網站來說,重要性不言而喻。今天來分享一個JavaWeb方式實作的檔案上傳下載下傳的小例子。

<a href="#%E9%A1%B9%E7%9B%AE%E4%BE%9D%E8%B5%96">項目依賴</a>

<a href="#%E9%A1%B9%E7%9B%AE%E7%9B%AE%E5%BD%95">項目目錄</a>

<a href="#%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B">工作流程</a>

<a href="#%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0">檔案上傳</a>

<a href="#%E8%A1%A8%E5%8D%95%E5%A4%84%E7%9A%84%E8%AE%BE%E7%BD%AE">表單處的設定</a>

<a href="#%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF">伺服器端</a>

<a href="#%E4%B8%8A%E4%BC%A0%E5%8A%9F%E8%83%BD%E7%9A%84%E5%AE%9E%E7%8E%B0">上傳功能的實作</a>

<a href="#uploadjsp">uploadjsp</a>

<a href="#messagejsp">messagejsp</a>

<a href="#uploadhandleservlet">UploadHandleServlet</a>

<a href="#webxml%E9%85%8D%E7%BD%AE">webxml配置</a>

<a href="#%E7%BB%93%E6%9E%9C%E5%B1%95%E7%A4%BA">結果展示</a>

<a href="#%E6%96%87%E4%BB%B6%E6%B5%8F%E8%A7%88">檔案浏覽</a>

<a href="#listfileservletjava">ListFileServletjava</a>

<a href="#listfilesjsp">listfilesjsp</a>

<a href="#webxml%E9%85%8D%E7%BD%AE-1">webxml配置</a>

<a href="#%E6%88%AA%E5%9B%BE%E7%BB%93%E6%9E%9C">截圖結果</a>

<a href="#%E6%B3%A8%E6%84%8F">注意</a>

<a href="#%E8%B7%AF%E5%BE%84%E9%97%AE%E9%A2%98">路徑問題</a>

<a href="#jstl%E4%BD%BF%E7%94%A8">JSTL使用</a>

<a href="#%E6%A8%A1%E6%9D%BF%E5%8F%98%E9%87%8F">模闆變量</a>

<a href="#%E6%96%87%E4%BB%B6%E4%B8%8B%E8%BD%BD">檔案下載下傳</a>

<a href="#downloadservletjava">DownLoadServletjava</a>

<a href="#webxml%E9%85%8D%E7%BD%AE-2">webxml配置</a>

<a href="#%E6%88%AA%E5%9B%BE%E5%B1%95%E7%A4%BA">截圖展示</a>

<a href="#%E6%80%BB%E7%BB%93">總結</a>

這個小例子是使用JavaWeb的JSP+Servlet實作的。另外使用了一些第三方的jar包。現列舉如下:

<code>apache-commons-fileupload.jar</code>+<code>apache-commons-io.jar</code>: 開源的一套便于使用的元件

<code>jstl.jar</code> + <code>standard.jar</code>: 模闆語言jsp中将會用到的支援

在開始項目之前,給出一個項目目錄可以使得我們的思路更加的清晰。

JavaWeb 檔案 上傳 下載下傳

對于新手而言。對web.xml的配置可能摸不着頭腦,下面給大家畫個圖吧。

Created with Raphaël 2.1.0URL連結根據url-pattern找到同級的servlet-name根據servlet-name可以擷取其父标簽servlet-mapping,然後擷取到servlet-mapping的兄弟節點servlet根據servlet-mapping的servlet-name就可以擷取到與之同名的servlet标簽的内容。從servlet标簽中擷取到servlet-class屬性的值,然後通過反射技術在tomcat容器中加載相應的類。進行一系列的業務邏輯操作。将擷取到的資料傳給jsp頁面模闆使用者擷取視圖

在開始編碼之前,我們還需要了解一些比較基礎的知識。可能你會覺得有點啰嗦了,但是為了照顧到不了解這些的童鞋,我還是多說幾句吧:-)

如果我們要想做一個上傳檔案功能,毫無疑問需要通過表單進行。是以,我們需要遵守一點規則。

以這個表單為例,我們不難發現。

<code>enctype="multipart/form-data"</code> 這行代碼,其作用就是告訴伺服器,我們的這個表單将用于檔案上傳處理。

通過表單來實作上傳固然很友善,但是除了檔案項之外的表單項怎麼處理呢? 這時我們就需要了解一下,關于<code>apache-commons-fileupload</code>的檔案處理了。

好了,下面開始上傳功能的實作。

在軟體使用的過程中,為了給使用者一個更加友好的使用者體驗,我們添加了一個與使用者單方面互動(簡單的提示作用)的頁面。用來傳遞代碼過程的必要資訊。

JavaWeb 檔案 上傳 下載下傳
JavaWeb 檔案 上傳 下載下傳

要想實作下載下傳功能,我們需要先給使用者一個引導,那就是咱們的網站上有什麼。是以我們需要對網站上提供下載下傳的檔案夾一個周遊。

思路如下:

Created with Raphaël 2.1.0定位到upload檔案夾讓業務邏輯在servlet中完成,獲得存儲了檔案資訊的Map集合将集合交給JSP頁面進行展示使用者獲得頁面視圖

JavaWeb 檔案 上傳 下載下傳

這裡有幾點容易出錯的地方,大家需要注意。

由于使用<code>this.getServletContext().getRealPath("/WEB-INF/upload");</code>的過程中出現了一些問題,是以我這裡使用了絕對路徑,大家可以自己的情況随意選擇。

在使用JSTL标簽庫的時候,千萬不要忘記引入相關的jar包。然後在JSP頁面上方填寫相應的聲明。還有就是URI屬性不要寫錯咯。是<code>&lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%&gt;</code>

在<code>&lt;c:forEach&gt;</code>标簽内部,使用的<code>&lt;c:param name="filename" value="${me.key}"&gt;&lt;/c:param&gt;</code>參數一定不要寫錯了。因為等會我們會根據這裡面的<code>name="filename"</code>屬性來唯一确定我們要下載下傳的檔案的資訊。

檔案下載下傳的功能本身并不難,核心就是告訴浏覽器header是什麼,然後通過一個流操作,将要進行下載下傳的資料發送給用戶端浏覽器即可。

JavaWeb 檔案 上傳 下載下傳
JavaWeb 檔案 上傳 下載下傳

最後關于整個項目的總結。使用<code>apache-commons-fileupload</code>元件确實是很友善,它可以友善的将表單中上傳的資料封裝到一個<code>List&lt;fileItem&gt;</code>中,我們隻需要對這個集合進行周遊操作,就可以随意的設定自己需要的内容。

最後,希望大家看完之後都能有所收獲。讓自己的網站的功能更加的豐富。