Struts2學(xué)習(xí)手冊之文件上傳基礎(chǔ)教程
前言
我們在開發(fā)Web應(yīng)用時,肯定要為用戶提供上傳的功能,比如用戶上傳一張圖像作為頭像等。為了能上傳文件,我們必須將表單的method設(shè)置為POST,將enctype設(shè)置為multipart/form-data。只有在這種情況下,瀏覽器才會把用戶選擇文件的二進制數(shù)據(jù)發(fā)送給服務(wù)器。這篇文章就對Struts2框架中的上傳功能進行詳細(xì)的總結(jié),下面話不多說了,來一起看看詳細(xì)的介紹吧。
Struts2的文件上傳
Struts2并未提供自己的請求解析器,也就是說,Struts2不會自己去處理multipart/form-data的請求,它需要調(diào)用其它上傳框架來解析二進制請求數(shù)據(jù),但Struts2在原有的上傳解析器基礎(chǔ)上做了進一步封裝,更進一步簡化了文件上傳。
在Struts2的default.properties配置文件中,可以看到這樣的配置代碼:
### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data # struts.multipart.parser=cos # struts.multipart.parser=pell # struts.multipart.parser=jakarta-stream struts.multipart.parser=jakarta # uses javax.servlet.context.tempdir by default struts.multipart.saveDir= struts.multipart.maxSize=2097152
上述代碼主要用于配置Struts2上傳文件時的上傳解析器。Struts2的封裝隔離了底層文件上傳組件的區(qū)別,開發(fā)者只要在此配置文件上傳所使用的解析器,就可以輕松地在不同的文件上傳框架之間切換。
Struts2默認(rèn)使用jakarta上傳解析器,當(dāng)然了,如果你不喜歡,你也可以換成別的。下面就通過代碼來實現(xiàn)一個簡單的基于Struts2的文件上傳功能。
實現(xiàn)文件上傳的Action
前臺頁面:
<form action="upload" method="post" enctype="multipart/form-data"> Title:<input type="text" name="title"><br> File:<input type="file" name="upload"><br> <input type="submit" value="submit"> </form>
Action類:
public class UploadAction extends ActionSupport
{
private String title;
private File upload;
private String uploadContentType;
private String uploadFileName;
private String savePath;
public void setSavePath(String value)
{
this.savePath = value;
}
private String getSavePath()
{
String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/" + savePath);
return realPath;
}
public void setTitle(String value)
{
this.title = value;
}
public String getTitle()
{
return title;
}
public void setUpload(File value)
{
this.upload = value;
}
public File getUpload()
{
return upload;
}
public void setUploadContentType(String value)
{
this.uploadContentType = value;
}
public String getFileContentType()
{
return uploadContentType;
}
public void setUploadFileName(String value)
{
this.uploadFileName = value;
}
public String getUploadFileName()
{
return uploadFileName;
}
@Override
public String execute() throws Exception
{
FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName());
FileInputStream fis = new FileInputStream(getUpload());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0)
{
fos.write(buffer, 0, len);
}
fis.close();
fos.close();
return SUCCESS;
}
}
struts.xml配置文件:
<package name="upload" extends="struts-default"> <action name="upload" class="com.jellythink.practise.UploadAction"> <param name="savePath">/upload</param> <result name="success">/success.jsp</result> <result name="input">/index.jsp</result> </action> </package>
對于Action類中,包含了兩個特別的屬性:
- uploadContentType
- uploadFileName
這兩個屬性分別用于封裝上傳文件的文件名、上傳文件的文件類型。對于Struts2來說,如果Form表單中包含一個name屬性為xxx的文件域,則對應(yīng)的Action需要使用三個屬性來封裝該文件域的信息:
- 類型為File的xxx屬性封裝了該文件域?qū)?yīng)的文件內(nèi)容;
- 類型為String的xxxFileName屬性封裝了該文件域?qū)?yīng)的文件的文件名;
- 類型為String的xxxContentType屬性封裝了該文件域?qū)?yīng)的文件的文件類型。
通過上面的開發(fā)過程,可以看出通過Struts2實現(xiàn)文件上傳確實是一件簡單的事情。我們需要做的事情就是將文件域與Action中一個類型為File的屬性關(guān)聯(lián),就可以輕松訪問到上傳文件的文件內(nèi)容,至于Struts2如何使用Multipart解析器,對開發(fā)者完全透明。
手動實現(xiàn)文件過濾
很多時候,Web應(yīng)用不允許用戶自由上傳,我們需要對用戶上傳的文件類型,文件大小進行限制,因此必須在文件上傳過程中進行文件過濾。下面就先手動實現(xiàn)上傳文件過濾。
在struts.xml中配置一個新的參數(shù),表示支持的上傳類型:
<param name="allowTypes">image/png,image/gif,image/jpeg</param>
在Action中添加驗證函數(shù):
// 進行驗證
@Override
public void validate()
{
String filterResult = filterType(getAllowTypes().split(","));
if (filterResult != null)
{
addFieldError("upload", "您要上傳的文件類型不正確!");
}
}
public String filterType(String[] types)
{
String fileType = getFileContentType();
for (String type : types)
{
if (type.equals(fileType))
{
return null;
}
}
return ERROR;
}
這只是實現(xiàn)了類型的判斷,然后在根據(jù)File類的length()方法,來實現(xiàn)大小的驗證。但是好麻煩,接下來就說一種更簡單的說法。
攔截器實現(xiàn)文件過濾
Struts2提供了一個文件上傳的攔截器,通過配置攔截器可以更輕松地實現(xiàn)文件過濾。Struts2中文件上傳的攔截器fileUpload,為了讓該攔截器起作用,只需要在該Action中配置該攔截器引用即可。
配置fileUpload攔截器時,可以為其指定兩個參數(shù):
- allowedTypes:該參數(shù)指定允許上傳的文件類型,多個文件類型之間以英文逗號隔開
- maximumSize:該參數(shù)指定允許上傳的文件大小,單位是字節(jié)
<!-- 配置fileUpload攔截器 --> <interceptor-ref name="fileUpload"> <param name="allowedTypes">image/png,image/gif,image/jpeg</param> <param name="maximumSize">20000000</param> </interceptor-ref> <!-- 配置系統(tǒng)默認(rèn)的攔截器 --> <interceptor-ref name="defaultStack" /> <result name="success">/success.jsp</result> <result name="input">/index.jsp</result>
這樣子,修改配置就可以搞定的事情,比寫一坨代碼真的輕松多了。
配置錯誤信息
對于上傳出現(xiàn)錯誤的情況,系統(tǒng)默認(rèn)都是提示英文的錯誤信息,但是為了輸出國際化的提示信息,這就需要在國際化的資源配置文件中增加以下兩個key的消息定義:
struts.messages.error.content.type.not.allowed=上傳文件類型不正確,請重新上傳struts.messages.error.file.too.large=您上傳的文件太大,請重新上傳
接下來就可以使用<s:fielderror/>來輸出錯誤信息了。
文件上傳的常量配置
在文章的開始,我們說到default.properties中的配置,其中有一個struts.multipart.saveDir配置,那么該配置項的具體作用是什么呢?
在Struts2執(zhí)行文件上傳的過程中,需要指定一個臨時文件夾,用來存放上傳過程中產(chǎn)生的臨時文件;如果沒有指定臨時文件夾,系統(tǒng)默認(rèn)使用javax.servlet.context.tempdir,在Tomcat安裝路徑下的work/Catalina/localhost/路徑下。而這個struts.multipart.saveDir就是配置臨時文件的存放位置的。所以在開發(fā)的過程中,一定要注意該目錄是否有讀寫權(quán)限哦。
還有一個struts.multipart.maxSize配置,該配置表示上傳文件的大小,如果同時指定了這個配置和fileUpload攔截器的maximumSize屬性,則先和struts.multipart.maxSize配置的比較,再和fileUpload攔截器的maximumSize屬性比較,如果文件大小超過了struts.multipart.maxSize配置的,則會出現(xiàn)異常,并不會將Result轉(zhuǎn)到input,這個一定要注意。
總結(jié)
這篇文章詳細(xì)的總結(jié)了Struts2中的文件上傳,內(nèi)容有點多,基本都是手冊上的內(nèi)容,也罷,就當(dāng)手冊了。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
java實現(xiàn)微信公眾平臺自定義菜單的創(chuàng)建示例
這篇文章主要介紹了java實現(xiàn)微信公眾平臺自定義菜單的創(chuàng)建示例,需要的朋友可以參考下2014-04-04
解決mybatis-plus自動配置的mapper.xml與java接口映射問題
這篇文章主要介紹了解決mybatis-plus自動配置的mapper.xml與java接口映射問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
關(guān)于MyBatis中Mapper?XML熱加載優(yōu)化
大家好,本篇文章主要講的是關(guān)于MyBatis中Mapper?XML熱加載優(yōu)化,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01
Spring Data JPA結(jié)合Mybatis進行分頁查詢的實現(xiàn)
本文主要介紹了Spring Data JPA結(jié)合Mybatis進行分頁查詢的實現(xiàn)2024-03-03
Java if(boolean)和if(boolean=true)區(qū)別解析
這篇文章主要介紹了Java if(boolean)和if(boolean=true)區(qū)別解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02
Spring框架應(yīng)用的權(quán)限控制系統(tǒng)詳解
在本篇文章里小編給大家整理的是關(guān)于基于Spring框架應(yīng)用的權(quán)限控制系統(tǒng)的研究和實現(xiàn),需要的朋友們可以學(xué)習(xí)下。2019-08-08
Maven發(fā)布項目 (jar包) 到Nexus私服中的操作
這篇文章主要介紹了Maven發(fā)布項目 (jar包) 到Nexus私服中的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
Maven項目在new module后,pom文件顯示為Ignored pom.xml問題
在Maven項目中,若創(chuàng)建過同名module后刪除,再次創(chuàng)建時可能導(dǎo)致pom.xml文件被IDEA忽略,原因是IDEA保留了之前module的痕跡,導(dǎo)致重建時將其視為已刪除的module,解決方法是進入IDEA設(shè)置,找到Maven的Ignored Files設(shè)置2024-09-09

