




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、開始Struts 2 第七章 struts2的上傳下載序 文件上傳是Web應(yīng)用經(jīng)常需要面對(duì)的問題,在大部分時(shí)候,用戶的請(qǐng)求參數(shù)是在表單域輸入的字符串,但如果為表單元素設(shè)置enctype="multipart/form-data”屬性,則提交表單時(shí)不再以字符串方式提交請(qǐng)求參數(shù),而是以二進(jìn)制編碼的方式提交請(qǐng)求,此時(shí)直接通過HttpServletRequest的getParamete:方法無(wú)法正常獲取請(qǐng)求參數(shù)的值,我們可以通過二進(jìn)制流來獲取請(qǐng)求內(nèi)容通過這種方式,就可以取得希望上傳文件的內(nèi)容,從而實(shí)現(xiàn)文件的上傳。推薦精選 Struts 2 未提供自己的請(qǐng)求解析器,也就是說,Struts 2不
2、會(huì)自己去處理multipart/form-data的請(qǐng)求,它需要調(diào)用其他請(qǐng)求解析器,將HTTP請(qǐng)求中的表單域解析出來。但Struts 2在原有的上傳解析器基礎(chǔ)上做了進(jìn)一步封裝,更進(jìn)一步簡(jiǎn)化了文件上傳。 在Struts 2的perties配置文件中,我們看到了下面的配置代碼,它們主要用于配置Struts 2上傳文件時(shí)的卜傳解析器。 #指定使用cos的文件上傳解析器 # struts.multipart .parser=cos #指定使用Pell的文件上傳解析器 #struts.multipart.parser=pell #Struts 2默認(rèn)使用Jakarta的Common-
3、FileUpload的文件上傳解析器 struts.multpart .parser=jakartaStruts 2默認(rèn)使用的是Jakarta的Common-FileUpload的文件上傳框架,要使用Struts 2的文件上傳功能,則需要在Web應(yīng)用中增加兩個(gè)commons-io-1.3. l .ja:和commons-fileupload-1.2. jar文件上傳例子:上傳頁(yè)面uload.jsp<form action="Upload.action" method="post" enctype="multipart/form-data&
4、quot;> 文件描述:<input type="text" name="fileDesc" /><br> <input type="file" name="file" /><br> <input type="submit" value="上傳" /><br> </form>上傳的actionprivate String fileDesc;/和前臺(tái)的是同一個(gè)private File fi
5、le;/這是IO的File,回顧下strust1.x的FormFile/這兩個(gè)字段是被注入進(jìn)來的,前臺(tái)頁(yè)面并沒有這兩個(gè)表單域private String fileFileName;private String fileContentType;/* * 獲得保存的路徑 */private String getSaveDir()return ServletActionContext.getServletContext().getRealPath("/userDatas");Overridepublic String execute() throws Exception Syst
6、em.out.println("#"+file.getName();System.out.println(""+fileFileName);System.out.println("#"+fileDesc);System.out.println("#"+fileContentType);File targetFile =new File(getSaveDir()+"/"+fileFileName);file.renameTo(targetFile);return "uploadOK&qu
7、ot;推薦精選配置文件:struts.xml<package name="com.huaxia.struts2.action" extends="struts-default"> <action name="Upload" class="com.huaxia.struts2.action.Upload"> <result name="uploadOK">/uploadOK.jsp</result> </action></packa
8、ge> 值得注意的是,上面的Action還包含了兩個(gè)屬性:uploadFileName和uploadContentType,這兩個(gè)屬性分別用于封裝上傳文件的文件名、上傳文件的文件類型。這兩個(gè)屬性,體現(xiàn)了Struts 2設(shè)計(jì)的靈巧、簡(jiǎn)化之處,Action類直接通過File類型屬性直接封裝了上傳文件的文件內(nèi)容,但這個(gè)File屬性無(wú)法獲取上傳文件的文件名和文件類型,所以Struts 2直接將文件域中包含的上傳文件名和文件類型的信息封裝到fileFileName和fileContentType屬性中??梢哉J(rèn)為:如果表單中包含一個(gè)name屬性為xxx的文件域,則對(duì)應(yīng)Action需要使用3個(gè)屬性來封
9、裝該文件域的信息:n .類型為File的xxx屬性封裝了該文件域?qū)?yīng)的文件內(nèi)容。這是臨時(shí)文件,在action調(diào)用execute后臨時(shí)文件會(huì)被刪除n ·類型為String的xxxFileName屬性封裝了該文件域?qū)?yīng)的文件的文件名。n ·類型為String的xxxContentType屬性封裝了該文件域?qū)?yīng)的文件的文件類型。如果要搞清楚struts的上傳機(jī)制,我們可以打開strust中fileupload攔截器的源代碼上傳的其他處理:1. 限制文件的大小2. 限制文件的上傳類型3. 上傳臨時(shí)目錄的設(shè)定限制文件的大小在struts2的默認(rèn)大小是2M,我們可以打開struts.p
10、roperites,查看相關(guān)設(shè)置,然后在struts.xml將相關(guān)設(shè)置覆蓋掉:# Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data# struts.multipart.parser=cos# struts.multipart.parser=pellstruts.multipart.parser=jakarta# uses javax.servlet.context.tempdir by defaultstruts.multipart.saveDir=struts.multip
11、art.maxSize=2097152覆蓋后:<struts><constant name="struts.multipart.saveDir" value="/upTemp" /><constant name="struts.multipart.maxSize" value="4194304" /><package name="com.huaxia.struts2.action" extends="struts-default"&g
12、t; <action name="Upload" class="com.huaxia.struts2.action.Upload"> <result name="uploadOK">/uploadOK.jsp</result> </action></package></struts> 推薦精選這里要強(qiáng)調(diào)的是,我們雖然設(shè)置了文件的臨時(shí)目錄,而且struts2在上傳動(dòng)作完畢后會(huì)自動(dòng)執(zhí)行刪除,但這個(gè)自動(dòng)刪除不一定每次都能刪除成功的,所以struts2設(shè)定了一個(gè)filte
13、r,用來每隔一段時(shí)間檢測(cè)臨時(shí)目錄,如果有文件則去刪除,filter的配置如下<!- 配置Struts2的C1eanUp的Filter -><filter><filter-name>struts-cleanup</filter-name><filter-class>org.apache struts2.dispatcher.ActionContextCleanUp</filter-class></filter><!- 定義Struts2的C1eanUp Filter攔截的URL-><filter
14、-mapping><filter-name>struts-cleanup</filter-name><url-pattern>/*</url-pattern></filter-mapping>限制文件的類型在查看fileupload的攔截器源代碼時(shí),我們發(fā)現(xiàn)如下兩個(gè)屬性:1. allowedTypes2. maximumSize從字面猜測(cè)就是允許的上傳類型和允許的上傳大小,我們可以覆蓋掉這兩個(gè)的配置:<package name="com.huaxia.struts2.action" extends=&q
15、uot;struts-default"> <action name="Upload" class="com.huaxia.struts2.action.Upload"> <interceptor-ref name="fileUpload" > <!- 這里是可以上傳文件的擴(kuò)展名 -> <param name="allowedExtensions">jpg,gif,png</param> <!- 這里是memi類型,在tomcat的配置
16、文件下可以找到很全的memi類型 -> <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/jpg ,image/x-png,image/pjpeg </param> <param name="maximumSize">4194304</param> </interceptor-ref> <interceptor-ref name="defaultStack" />
17、; <result name="uploadOK">/uploadOK.jsp</result> <result name="input">/upload.jsp</result> </action></package>注意如果我們?cè)O(shè)置了攔截器,就要將默認(rèn)的攔截器棧也加上,在攔截器章節(jié)講過錯(cuò)誤信息顯示:當(dāng)上傳文件出現(xiàn)錯(cuò)誤時(shí),我們?cè)O(shè)定了“input”為上傳頁(yè)面,即出現(xiàn)錯(cuò)誤的話,回到上傳頁(yè)面,我們?cè)谏蟼黜?yè)面稍作修改,添加如下代碼:<s:fielderror />我們上傳一個(gè)錯(cuò)
18、誤類型的文件,發(fā)現(xiàn):推薦精選如果要自定義消息內(nèi)容的話:我們就要加入消息資源文件了,首先在struts.xml中加入:<constant name="struts.custom.i18n.resources" value="Resource" />然后,在src下添加Rperties資源文件,輸入以下消息:struts.messages.error.file.too.large=The File 1 is too large :3 bstruts.messages.error.content.type.not.allowe
19、d=The File :1 is not supportedstruts.messages.error.file.extension.not.allowed=The File : 1 s extension is not supported關(guān)于key的來源和占位符的替代值可以參看fileupload攔截器的源代碼的acceptFile方法同時(shí)上傳多個(gè)文件:同時(shí)上傳多個(gè)文件和上傳單個(gè)文件的過程是一模一樣的,只不過要滿足以下條件:1. 前臺(tái)可以將多個(gè)文件域的name屬性設(shè)置成一樣2. 在action中用數(shù)組或List來接收前臺(tái)的File3. 循環(huán)數(shù)組或list,對(duì)每個(gè)File對(duì)象進(jìn)行操作文件的下載
20、:Struts下載主要是配置好一個(gè)result,這個(gè)result的類型是“stream”類型的,可去struts-default.xml查找相應(yīng)的源代碼:這里只貼出下載的代碼和配置:Action/告訴瀏覽器數(shù)據(jù)是以下載的形式接收推薦精選private String contentType="application/x-msdownload"/告訴瀏覽器數(shù)據(jù)將要下載的文件的文件名private String contentDisposition="attachment;filename="/設(shè)置服務(wù)器讀取文件的緩沖區(qū)大小private String bufferSize="2048"/前臺(tái)提交過來需要下載的文件的文件名、路徑private String fnamepath;Overridepublic String execute() throws Exception File temp = new File(fnamepath);this.contentDisposition+=temp.getName();return "down" /* * 此方法將文件多對(duì)應(yīng)的讀取流拿到,getFile是和配置文件中inputName對(duì)應(yīng)的 */public InputStrea
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 球館施工改造方案(3篇)
- 公司對(duì)外輿情管理制度
- 車間屋頂通風(fēng)方案(3篇)
- 培訓(xùn)機(jī)構(gòu)落地管理制度
- 小學(xué)環(huán)境治理管理制度
- 線路改造增效方案(3篇)
- 房屋征收應(yīng)急管理制度
- 工地防汛物資管理制度
- 超市工具采購(gòu)方案(3篇)
- 應(yīng)急食品組裝方案(3篇)
- 2024年淄博高新區(qū)事業(yè)單位招聘退役大學(xué)生士兵筆試真題
- 拘留所建設(shè)標(biāo)準(zhǔn)(建標(biāo)102-2008)
- 《電力系統(tǒng)最優(yōu)潮流的數(shù)學(xué)模型計(jì)算案例》6100字
- 2024秋新湘少版英語(yǔ)三年級(jí)上冊(cè)教學(xué)課件 Unit 9 第1課時(shí)
- 安全生產(chǎn)風(fēng)險(xiǎn)防控“六項(xiàng)機(jī)制”做法及經(jīng)驗(yàn)分享
- 全國(guó)統(tǒng)一市政工程預(yù)算定額
- 濟(jì)寧醫(yī)學(xué)院《復(fù)變函數(shù)本》2023-2024學(xué)年第二學(xué)期期末試卷
- 村集體合同管理制度
- 基坑排水降水方案
- 綜合與實(shí)踐 白晝時(shí)長(zhǎng)規(guī)律的探究說課稿 2024-2025學(xué)年人教版數(shù)學(xué)七年級(jí)下冊(cè)
- 安徽省合肥市蜀山區(qū)重點(diǎn)中學(xué)2025屆中考二模生物試題含解析
評(píng)論
0/150
提交評(píng)論