国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Struts2學習手冊之文件上傳基礎教程

2024-07-14 08:40:34
字體:
來源:轉載
供稿:網友

前言

我們在開發Web應用時,肯定要為用戶提供上傳的功能,比如用戶上傳一張圖像作為頭像等。為了能上傳文件,我們必須將表單的method設置為POST,將enctype設置為multipart/form-data。只有在這種情況下,瀏覽器才會把用戶選擇文件的二進制數據發送給服務器。這篇文章就對Struts2框架中的上傳功能進行詳細的總結,下面話不多說了,來一起看看詳細的介紹吧。

Struts2的文件上傳

Struts2并未提供自己的請求解析器,也就是說,Struts2不會自己去處理multipart/form-data的請求,它需要調用其它上傳框架來解析二進制請求數據,但Struts2在原有的上傳解析器基礎上做了進一步封裝,更進一步簡化了文件上傳。

在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-streamstruts.multipart.parser=jakarta# uses javax.servlet.context.tempdir by defaultstruts.multipart.saveDir=struts.multipart.maxSize=2097152

上述代碼主要用于配置Struts2上傳文件時的上傳解析器。Struts2的封裝隔離了底層文件上傳組件的區別,開發者只要在此配置文件上傳所使用的解析器,就可以輕松地在不同的文件上傳框架之間切換。

Struts2默認使用jakarta上傳解析器,當然了,如果你不喜歡,你也可以換成別的。下面就通過代碼來實現一個簡單的基于Struts2的文件上傳功能。

實現文件上傳的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的文件域,則對應的Action需要使用三個屬性來封裝該文件域的信息:

  • 類型為File的xxx屬性封裝了該文件域對應的文件內容;
  • 類型為String的xxxFileName屬性封裝了該文件域對應的文件的文件名;
  • 類型為String的xxxContentType屬性封裝了該文件域對應的文件的文件類型。

通過上面的開發過程,可以看出通過Struts2實現文件上傳確實是一件簡單的事情。我們需要做的事情就是將文件域與Action中一個類型為File的屬性關聯,就可以輕松訪問到上傳文件的文件內容,至于Struts2如何使用Multipart解析器,對開發者完全透明。

手動實現文件過濾

很多時候,Web應用不允許用戶自由上傳,我們需要對用戶上傳的文件類型,文件大小進行限制,因此必須在文件上傳過程中進行文件過濾。下面就先手動實現上傳文件過濾。

在struts.xml中配置一個新的參數,表示支持的上傳類型:

<param name="allowTypes">image/png,image/gif,image/jpeg</param>

在Action中添加驗證函數:

// 進行驗證@Overridepublic 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;}

這只是實現了類型的判斷,然后在根據File類的length()方法,來實現大小的驗證。但是好麻煩,接下來就說一種更簡單的說法。

攔截器實現文件過濾

Struts2提供了一個文件上傳的攔截器,通過配置攔截器可以更輕松地實現文件過濾。Struts2中文件上傳的攔截器fileUpload,為了讓該攔截器起作用,只需要在該Action中配置該攔截器引用即可。

配置fileUpload攔截器時,可以為其指定兩個參數:

  • allowedTypes:該參數指定允許上傳的文件類型,多個文件類型之間以英文逗號隔開
  • maximumSize:該參數指定允許上傳的文件大小,單位是字節
<!-- 配置fileUpload攔截器 --><interceptor-ref name="fileUpload"> <param name="allowedTypes">image/png,image/gif,image/jpeg</param> <param name="maximumSize">20000000</param></interceptor-ref><!-- 配置系統默認的攔截器 --><interceptor-ref name="defaultStack" /><result name="success">/success.jsp</result><result name="input">/index.jsp</result>

這樣子,修改配置就可以搞定的事情,比寫一坨代碼真的輕松多了。

配置錯誤信息

對于上傳出現錯誤的情況,系統默認都是提示英文的錯誤信息,但是為了輸出國際化的提示信息,這就需要在國際化的資源配置文件中增加以下兩個key的消息定義:

  • struts.messages.error.content.type.not.allowed=上傳文件類型不正確,請重新上傳
  • struts.messages.error.file.too.large=您上傳的文件太大,請重新上傳

接下來就可以使用<s:fielderror/>來輸出錯誤信息了。

文件上傳的常量配置

在文章的開始,我們說到default.properties中的配置,其中有一個struts.multipart.saveDir配置,那么該配置項的具體作用是什么呢?

在Struts2執行文件上傳的過程中,需要指定一個臨時文件夾,用來存放上傳過程中產生的臨時文件;如果沒有指定臨時文件夾,系統默認使用javax.servlet.context.tempdir,在Tomcat安裝路徑下的work/Catalina/localhost/路徑下。而這個struts.multipart.saveDir就是配置臨時文件的存放位置的。所以在開發的過程中,一定要注意該目錄是否有讀寫權限哦。

還有一個struts.multipart.maxSize配置,該配置表示上傳文件的大小,如果同時指定了這個配置和fileUpload攔截器的maximumSize屬性,則先和struts.multipart.maxSize配置的比較,再和fileUpload攔截器的maximumSize屬性比較,如果文件大小超過了struts.multipart.maxSize配置的,則會出現異常,并不會將Result轉到input,這個一定要注意。

總結

這篇文章詳細的總結了Struts2中的文件上傳,內容有點多,基本都是手冊上的內容,也罷,就當手冊了。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 突泉县| 高唐县| 岫岩| 明光市| 南乐县| 色达县| 惠安县| 宣汉县| 新邵县| 济源市| 长岭县| 安平县| 西乡县| 吉安市| 兴隆县| 县级市| 湘阴县| 泰来县| 普洱| 抚顺市| 沭阳县| 东乌珠穆沁旗| 伊春市| 新昌县| 宁夏| 新邵县| 富顺县| 且末县| 宁国市| 澜沧| 湖口县| 宁陕县| 广水市| 靖州| 察隅县| 丰城市| 正安县| 马边| 武清区| 水城县| 平罗县|