Struts2 控制文件上傳下載功能實(shí)例代碼
之前介紹servlet3.0新特性的時(shí)候有提到過servlet API提供了一個(gè)part類來實(shí)現(xiàn)對(duì)文件的上傳和保存,Struts其實(shí)是在其基礎(chǔ)上做了進(jìn)一步的封裝,更加簡(jiǎn)單易用。至于文件下載,Struts貫徹AOP 思想,在下載之前提供對(duì)用戶權(quán)限控制的API。
下面我們將詳細(xì)介紹上傳和下載的相關(guān)內(nèi)容。
一、Struts文件上傳機(jī)制
想要實(shí)現(xiàn)文件上傳功能,頁(yè)面的表單的method屬性必須被指定為post,還有enctype屬性必須為multipart/form-data,該值表示上傳的內(nèi)容將會(huì)以二進(jìn)制的形式被上傳到服務(wù)器,至于該屬性的其他值的作用及他們之間的區(qū)別,請(qǐng)查看之前文章:servlet3.0新特性。下面給出表現(xiàn)層頁(yè)面代碼:
<body> <s:form method="post" enctype="multipart/form-data" action="/upload"> <s:file name="ufile" label="瀏覽"/> <s:submit value="上傳"/> </s:form> </body>
實(shí)際上在Struts的文件上傳中,它使用三個(gè)Action屬性來描述被上傳的文件。commons-fileupload-1.3.2.jar和commons-io-2.2.jar這兩個(gè)包就是用于輔助表單上傳的內(nèi)容賦值到action屬性中,所以在使用Struts的文件上傳之前應(yīng)當(dāng)先包含著兩個(gè)包到項(xiàng)目中。下面給出upload對(duì)應(yīng)的action:
public class UploadFile extends ActionSupport { //封裝的上傳文件的文件內(nèi)容 private File ufile; //封裝的上傳文件的文件名 private String ufileFileName; //封裝的上傳文件的文件類型 private String ufileContentType; ....省去getter,setter方法 public String execute() throws IOException { FileInputStream fin = new FileInputStream(ufile); FileOutputStream fos = new FileOutputStream("F:\\360\\"+ufileFileName); byte[] buffer = new byte[1024]; int len; while((len = fin.read(buffer))>0){ fos.write(buffer,0,len); } return SUCCESS; } }
先不看execute方法,在該action中,我們可以看到有三個(gè)屬性。ufile封裝了上傳的文件的二進(jìn)制內(nèi)容,ufileFileName(xxxFileName)封裝了該文件的文件名,ufileContentType(xxxContentType)封裝了該文件的類型。他們的值是我們不必關(guān)心的,框架會(huì)根據(jù)表單上傳的文件對(duì)他們進(jìn)行賦值,只需要遵守他的命名規(guī)則即可。
execute方法主要是完成將上傳的文件保存到硬盤上,代碼也比較簡(jiǎn)單,讀取屬性u(píng)file中的內(nèi)容,寫入磁盤指定位置。下面我們看看運(yùn)行的結(jié)果截圖:
至此我們就完成了對(duì)上傳文件的獲取保存,總體上看來,實(shí)際上還是使用了三個(gè)action實(shí)例屬性對(duì)上傳文件相關(guān)信息的封裝。一個(gè)屬性封裝的是該上傳文件的二進(jìn)制內(nèi)容,一個(gè)屬性封裝該文件的文件名稱,一個(gè)屬性封裝的是該文件的文件類型。實(shí)際上把控好這三個(gè)屬性,基本可以完成對(duì)該上傳文件的所有操作。下面我們看文件下載。
二、Struts文件下載機(jī)制
廣義上的文件下載,其實(shí)可以使用a標(biāo)簽鏈接到對(duì)應(yīng)資源完成對(duì)資源的下載,但是在瀏覽器中使用這種方式會(huì)導(dǎo)致瀏覽器直接打開該資源文件而非彈出下載框指定下載位置。Struts下載機(jī)制通過配置result元素的type屬性為stream來實(shí)現(xiàn)的。在類型為stream的result元素中可以配置一些參數(shù),這些參數(shù)主要有以下一些:
contentType:指定被下載文件的文件類型
inputName:指定被下載文件的輸入流入口
contentDisposition:指定下載文件的文件名
bufferSize:指定下載文件的緩沖大小
具體的應(yīng)用我們從代碼示例中體會(huì):
//直接訪問的action <body> <a href="/download" rel="external nofollow" >下載資源</a> </body> public class DownloadFile extends ActionSupport { private String inputPath; public void setInputPath(String s){ this.inputPath = s; } public String getInputPath(){ return this.inputPath; } public InputStream getTarFile(){ return ServletActionContext.getServletContext().getResourceAsStream(inputPath); } @Override public String execute(){ return SUCCESS; } } //download的action配置 <action name="download" class="MyPackage.DownloadFile"> <param name="inputPath">/m.jpg</param> <result type="stream"> <param name="inputName">tarFile</param> <param name="contentType">image/jpg</param> <param name="contentDisposition">attachment;filename="walker.jpg"</param> </result> </action>
首先解析下Struts.xml中有關(guān)action的配置代碼,第一個(gè)param元素為action中的屬性inputPath動(dòng)態(tài)賦值,該參數(shù)的值指定了將要被下載的文件資源位置,我們此處指定的web應(yīng)用根目錄下的一張圖片。
接下來就是配置的結(jié)果類型result,該元素的默認(rèn)type屬性為dispather表示分發(fā)的意思,而我們此處的stream表示流的意思,它將返回給瀏覽器一個(gè)InputStream(被下載文件的入口)。其中它配置了inputName,該參數(shù)的值對(duì)應(yīng)于action中g(shù)etXXXX方法,當(dāng)接受到請(qǐng)求的時(shí)候,框架會(huì)通過該參數(shù)匹配調(diào)用action中的getXXXX方法,該方法會(huì)根據(jù)指定資源路徑返回該文件的入口InputStream,交給瀏覽器。
我們也看到contentType參數(shù)指定了該文件的類型,和互聯(lián)網(wǎng)MIME標(biāo)準(zhǔn)中的規(guī)定類型一致,例如:text/plain代表純文本,text/xml表示XML,image/gif代表GIF圖片,image/jpeg代表JPG圖片等。
contentDisposition參數(shù)表示被下載文件在保存時(shí)候的文件名,它有兩個(gè)屬性值。第一個(gè)屬性值可以是inline或者attachment,它指定瀏覽器是直接打開還是下載,filename指定了下載或者打開文件的名稱。下面看上述代碼的運(yùn)行結(jié)果截圖:
至此,有關(guān)Struts控制文件的上傳和下載的相關(guān)內(nèi)容已經(jīng)簡(jiǎn)單介紹完了,有些核心的,深層次的內(nèi)容涉及到攔截器,所以當(dāng)我們介紹完攔截器之后,想必大家會(huì)有更加深刻的理解。
以上所述是小編給大家介紹的Struts2 控制文件上傳下載功能實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- JSP開發(fā)之Struts2實(shí)現(xiàn)下載功能的實(shí)例
- struts2實(shí)現(xiàn)文件下載功能
- java中Struts2 的文件上傳和下載示例
- Struts2實(shí)現(xiàn)文件下載功能代碼分享(文件名中文轉(zhuǎn)碼)
- java中struts2實(shí)現(xiàn)簡(jiǎn)單的文件上傳與下載
- java中struts2實(shí)現(xiàn)文件上傳下載功能
- JavaWeb中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- JavaEE中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- java中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- struts2實(shí)現(xiàn)簡(jiǎn)單文件下載功能
相關(guān)文章
Java實(shí)現(xiàn)的3des加密解密工具類示例
這篇文章主要介紹了Java實(shí)現(xiàn)的3des加密解密工具類,結(jié)合完整實(shí)例形式分析了3des加密解密的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-10-10java中重寫equals()方法的同時(shí)要重寫hashcode()方法(詳解)
下面小編就為大家?guī)硪黄猨ava中重寫equals()方法的同時(shí)要重寫hashcode()方法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05JavaMap兩種遍歷方式keySet與entrySet詳解
這篇文章主要介紹了JavaMap兩種遍歷方式keySet與entrySet,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03如何解決報(bào)錯(cuò):java.net.BindException:無法指定被請(qǐng)求的地址問題
在Linux虛擬機(jī)上安裝并啟動(dòng)Tomcat時(shí)遇到啟動(dòng)失敗的問題,通過檢查端口及配置文件未發(fā)現(xiàn)異常,后發(fā)現(xiàn)/etc/hosts文件中缺少localhost的映射,添加后重啟Tomcat成功,Tomcat啟動(dòng)時(shí)會(huì)檢查localhost的IP映射,缺失或錯(cuò)誤都可能導(dǎo)致啟動(dòng)失敗2024-10-10使用Mybatis實(shí)現(xiàn)分頁(yè)效果示例
大家好,本篇文章主要講的是使用Mybatis實(shí)現(xiàn)分頁(yè)效果示例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12java實(shí)現(xiàn)字符串轉(zhuǎn)String數(shù)組的方法示例
這篇文章主要介紹了java實(shí)現(xiàn)字符串轉(zhuǎn)String數(shù)組的方法,涉及java字符串的遍歷、分割、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10