第7章文件上傳和下載_第1頁
第7章文件上傳和下載_第2頁
第7章文件上傳和下載_第3頁
第7章文件上傳和下載_第4頁
第7章文件上傳和下載_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第7章文件上傳和下載文件的上傳和下載是Web應(yīng)用中常用的功能。一般情況下可以通過二進(jìn)制編碼的方式來獲得請求參數(shù)的值,從而通過二進(jìn)制流來獲得上傳文件內(nèi)容。這種手動編程方式比較麻煩,需要手動地控制二進(jìn)制流,相當(dāng)?shù)膹?fù)雜。不過可以使用其他開源組織提供的上傳項目,通過這些項目可以非常簡單的完成文件上傳。7.1使用上傳框架實現(xiàn)文件上傳7.1.1上傳框架介紹

7.1.2下載并安裝Common-FileUpload框架

7.1.3通過Common-FileUpload框架實現(xiàn)文件上傳

7.1.4測試文件上傳

7.1.5上傳多個文件7.1.6測試上傳多個文件7.1.7下載并安裝COS框架7.1.8通過COS框架實現(xiàn)文件上傳7.1.9測試使用COS框架實現(xiàn)文件上傳7.1.1上傳框架介紹文件上傳和下載,是一個Web開發(fā)應(yīng)用中常用的功能。在開發(fā)中會經(jīng)常需要實現(xiàn)文件的上傳和下載??梢酝ㄟ^獲得HTTP請求的輸入流,然后通過輸出流將數(shù)據(jù)保存到文件中。不過遇到了很多問題,比如說要實現(xiàn)非文本文件的上傳,需要通過自己編寫代碼來實現(xiàn)是非常困難的事情。有時候可以不必自己去造輪子,而是使用別人造好的輪子。為什么選擇使用Struts2框架呢,也就是因為通過它來構(gòu)建Web應(yīng)用會變得更加簡單、方便。同樣可以使用一些開源的上傳框架來實現(xiàn)文件上傳,這樣可以很輕松地完成應(yīng)用的需求。不過其底層的實現(xiàn)機(jī)制也要花一點時間去了解。雖然不要去手動實現(xiàn)該框架,但是要能夠?qū)υ摽蚣軐崿F(xiàn)原理有所掌握。下面來看看目前有哪些優(yōu)秀的上傳框架。目前比較流行的有Common-FileUpload框架、COS框架,這兩個框架都出生豪門,其上傳功能實現(xiàn)得非常好。而且代碼封裝得特別好,開發(fā)人員只需創(chuàng)建幾個對象并調(diào)用其方法就能實現(xiàn)文件上傳。7.1.2下載并安裝Common-FileUpload框架首先還是要去下載Common-FileUpload框架。Common-FileUpload框架是Apache開源組織下的一個項目。登錄Apache的官方站點并找到j(luò)akarta項目下的Commons項目,單擊此鏈接進(jìn)入Commons項目首頁,如圖7-1所示。7.1.3通過Common-FileUpload框架實現(xiàn)文件上傳現(xiàn)在來看如何通過Common-FileUpload框架實現(xiàn)文件上傳。7.1.4測試文件上傳現(xiàn)在來測試是否能真正地完成文件上傳。首先打開用戶輸入頁,如圖7-4所示。,用戶名就填寫用戶自己的名字吧,上傳文件選擇一個文件比較小點的文件,單擊“上傳”按鈕進(jìn)行上傳。頁面跳轉(zhuǎn)到結(jié)果輸出頁。頁面中顯示了用戶名以及上傳的文件名,如圖7-5所示。7.1.5上傳多個文件下面來看如何同時上傳多個文件。在Servlet中使用了循環(huán)遍歷所有的表單域,所以只要在用戶輸入頁中增加文件域就可以了,修改代碼如下所示。7.1.6測試上傳多個文件打開用戶輸入頁,填寫用戶名并選擇兩個文件進(jìn)行上傳,如圖7-9所示。頁面跳轉(zhuǎn)到結(jié)果輸出頁。頁面中顯示了用戶名以及上傳的文件名,如圖7-10所示。7.1.7下載并安裝COS框架下面來看另一個上傳框架,COS框架。COS框架是oreilly組織下的一個小項目。要獲得它首先要登錄其官方站點“”,單擊右側(cè)導(dǎo)航欄中的“com.oreilly.servlet”鏈接進(jìn)入COS項目首頁,如圖7-13所示。從項目首頁中看到目前COS的最新版本為05Nov2002,單擊其下載鏈接進(jìn)行下載。下載完成后,得到一個名為cos-05Nov2002.zip的壓縮文件包,如圖7-14所示。7.1.8通過COS框架實現(xiàn)文件上傳現(xiàn)在來看如何通過COS框架來實現(xiàn)文件上傳。首先將用戶輸入頁和結(jié)果頁稍微做些修改,將如下代碼:<h1>通過Common-FileUpload框架完成上傳</h1>替換成:<h1>通過COS框架完成上傳</h1>COS框架的核心類為MultipartParser,這個類負(fù)責(zé)解析HTTP請求,同時還可以用來設(shè)置上傳文件的最大值??梢酝ㄟ^MultipartParser的readNextPart()方法來獲得所有的表單域。COS使用Part實例來表示所有的表單域,也就是說不管是普通表單域還是文件域,其類型都是Part。可以調(diào)用Part實例的isParam()方法來判斷該表單域是不是普通表單域,同樣也可以調(diào)用其isFile()來判斷該表單域是不是文件域。7.1.9測試使用COS框架實現(xiàn)文件上傳打開用戶輸入頁,填寫用戶名并選擇兩個文件進(jìn)行上傳,如圖7-15所示。頁面跳轉(zhuǎn)到結(jié)果輸出頁。頁面中顯示了用戶名以及上傳的文件名,如圖7-16所示。7.2基于Struts2完成文件上傳前面介紹了如何通過Common-FileUpload框架和COS框架實現(xiàn)了文件上傳。Struts2并沒有提供上傳組件,而是通過調(diào)用這些上傳框架來實現(xiàn)的上傳。Struts2對于這些上傳框架進(jìn)行了進(jìn)一步封裝,從而更加簡化了文件上傳。7.2.1配置上傳解析器前面分別通過Common-FileUpload框架和COS框架實現(xiàn)了文件上傳,下面來看如何基于Struts2來完成文件上傳。前面提到過Struts2并沒有提供上傳組件,而是通過調(diào)用這些上傳框架來實現(xiàn)的上傳,那么如何在Struts2中配置這些上傳框架呢?首先打開導(dǎo)入struts2-core-.jar庫文件,找到org.apache.struts2包下的perties資源文件,代碼如下所示。在該資源文件中給出了許多的Struts2的默認(rèn)配置,其中可以看到Struts2默認(rèn)使用jakarta作為其文件上傳的解析器,代碼如下所示。###ParsertohandleHTTPPOSTrequests,encodedusingtheMIME-typemultipart/form-data#struts.multipart.parser=cos#struts.multipart.parser=pellstruts.multipart.parser=jakarta7.2.2實現(xiàn)文件上傳Action下面就來看如何基于Struts2完成單個文件上傳。首先創(chuàng)建用戶輸入頁,該頁面僅僅包含一個表單,用來輸入用戶名以及選擇用來上傳的文件,表單提交到upload.action,代碼如下所示。<%@pagelanguage="java"pageEncoding="gb2312"%><html><head><title>文件上傳</title></head> <center> <h1>Struts2完成上傳</h1><formaction="upload.action"method="post"enctype="multipart/form-data"> <table> <tr> <td>用戶名:</td> <td><inputtype="text"name="username"></td> </tr> <tr> <td>上傳文件:</td> <td><inputtype="file"name="myFile"></td> </tr> <tr> <td><inputtype="submit"value="上傳"></td> <td><inputtype="reset"></td> </tr> </table></form></center><body></body></html>7.2.3配置文件上傳Action在struts.xml文件中配置文件上傳Action。定義upload的Action,指定其實現(xiàn)類為net.hncu.struts2.action.UploadAction。為了能夠接受中文參數(shù)值,設(shè)置參數(shù)編碼為gb2312,代碼如下所示。<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN""/dtds/struts-2.0.dtd"><!--struts為配置文件根元素--><struts><!--設(shè)置參數(shù)編碼--><constantname="struts.i18n.encoding"value="gb2312"></constant><!--Action必須放在指定的包名空間中--><packagename="struts2"extends="struts-default"><!--定義upload的Action,其實現(xiàn)類為net.hncu.struts2.action.UploadAction--><actionname="upload"class="net.hncu.struts2.action.UploadAction"><!--定義處理結(jié)果與視圖資源之間的關(guān)系--><resultname="success">/result.jsp</result><resultname="input">/upload.jsp</result></action></package></struts>7.2.4測試文件上傳打開用戶輸入頁,填寫用戶名并選擇文件進(jìn)行上傳,如圖7-19所示。頁面跳轉(zhuǎn)到結(jié)果輸出頁。頁面中顯示了用戶名以及上傳的文件名,如圖7-20所示。7.3文件上傳高級配置前面介紹了如何基于Struts2完成文件上傳,Struts2還提供了文件上傳的高級配置從而實現(xiàn)文件保存目錄的配置、文件過濾以及輸出錯誤提示等。7.3.1配置文件保存目錄Struts2提供了文件上傳的高級配置用來實現(xiàn)保存目錄的配置。首先在Action中添加savePath屬性,該屬性用來封裝上傳文件保存目錄,為該屬性添加setter和getter方法,代碼如下所示。7.3.2實現(xiàn)文件過濾Struts2提供了文件上傳的高級配置用來實現(xiàn)文件的過濾。要實現(xiàn)文件過濾,只需配置文件上傳攔截器的屬性。文件上傳攔截器中有如下兩個屬性。protectedLongmaximumSize;protectedStringallowedTypes;maximumSize:該屬性用來指定上傳文件大小的最大值,單位為字節(jié)(Byte)。allowedTypes:該屬性用來指定允許上傳的文件類型。下面在struts.xml文件中配置該文件上傳攔截器,指定上傳文件大小的最大值為50KB,指定上傳文件的類型為BMP或者JPG。7.3.3輸出錯誤提示現(xiàn)在限制了文件上傳的類型以及大小,那么如果用戶提交不符合要求文件應(yīng)該給出錯誤信息提示。很幸運(yùn),Struts2的文件上傳攔截器FileUploadInterceptor幫助做到了這一點。FileUploadInterceptor攔截器將錯誤信息保存到fileldError中,F(xiàn)ileUploadInterceptor攔截器代碼如下所示。7.4Struts2實現(xiàn)上傳多個文件前面介紹的都是上傳一個文件,其實Struts2也可以很方便地實現(xiàn)多文件上傳。如果頁面中有多個文件域需要實現(xiàn)文件上傳,則只需在Action為每個文件域指定三個屬性分別用來封裝上傳文件、上傳文件類型、上傳文件名。7.4.1使用數(shù)組實現(xiàn)上傳多個文件前面介紹的都是上傳單個文件,下面來看如何實現(xiàn)上傳多個文件。可以選擇在Action為每個文件域指定三個屬性分別用來封裝上傳文件、上傳文件類型、上傳文件名。這樣確實可以實現(xiàn)多個文件的上傳,但是這樣使得代碼過于臃腫,而且失去了靈活性。如果以后要添加一個文件域,那就必須在Actionh中為其添加相應(yīng)的屬性。這時可以使用數(shù)組或者List來封裝所有的文件域,不過前提是這些文本域的name屬性必須相同。下面新建一個用戶輸入頁,添加兩個文件域,其name屬性都為myFile。7.4.2測試使用數(shù)組實現(xiàn)上傳多個文件打開用戶輸入頁,填寫用戶名并選擇文件進(jìn)行上傳,如圖7-26所示。頁面跳轉(zhuǎn)到結(jié)果輸出頁。頁面中顯示了用戶名以及上傳的文件名,如圖7-27所示。7.4.3使用List實現(xiàn)上傳多個文件這里還可以使用List來處理多個文件的上傳,這種方式和使用數(shù)組基本類似。只需要將使用數(shù)組類型封裝文件域中的數(shù)組類型替換成List類型就可以了。7.5文件下載通過Struts2的文件下載支持可以輕松地完成文件下載,而且還可以實現(xiàn)中文文件名下載。通過Struts2文件下載支持與攔截器相結(jié)合可以實現(xiàn)文件的下載權(quán)限控制。7.5.1使用Struts2配置文件下載前面介紹的都是文件上傳的知識,下面來看如何實現(xiàn)文件下載。有朋友肯定會問提出,實現(xiàn)文件下載很簡單?。≈灰o出該文件的超鏈接不就行了嗎?那下面就按照這樣的方法,使用超鏈接來實現(xiàn)文件下載。首先在Web項目根目錄下添加一個文件夾dowload,在該文件夾下放置一個壓縮文件1.zip。編寫下載頁面dowload.jsp,添加該文件的下載鏈接,代碼如下所示。<%@pagelanguage="java"pageEncoding="gb2312"%><%@taglibprefix="s"uri="/struts-tags"%><html><head><title>文件下載</title></head> <center> <h1>文件下載</h1> <ahref="download/1.zip">鏈接方式下載</a></center><body></body></html>7.5.2實現(xiàn)文件下載Action新建文件下載Action,該Action與以前創(chuàng)建的Action沒有太大的不同。不過如果要實現(xiàn)文件下載,必須為該Action提供一個返回InputStream流的方法,代碼如下所示。packagenet.hncu.struts2.action;importjava.io.InputStream;importorg.apache.struts2.ServletActionContext;importcom.opensymphony.xwork2.ActionSupport;publicclassDownloadActionextendsActionSupport{//該方法返回需要被下載文件的輸入流publicInputStreamgetDownload(){returnServletActionContext.getServletContext().getResourceAsStream("/download/復(fù)件1.zip");}publicStringexecute()throwsException{returnSUCCESS;}}這里使用ServletContext的getResourceAsStream()返回被下載文件的輸入流。7.5.3配置該文件下載Action下面需要對文件下載Action進(jìn)行配置,這里與前面不同的是需要配置該Action一個類型為stream的結(jié)果??梢酝ㄟ^struts-default.xml文件查看stream結(jié)果的配置,代碼如下所示。<result-types>。。。<result-typename="stream"class="org.apache.struts2.dispatcher.StreamResult"/>。。。</result-types>從stream結(jié)果的配置可以看出,其對應(yīng)的實現(xiàn)類為StreamResult,代碼如下所示。publicclassStreamResultextendsStrutsResultSupport{。。。protectedStringcontentType="text/plain";protectedStringconten

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論