最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Struts2學(xué)習(xí)手冊(cè)之文件上傳基礎(chǔ)教程

 更新時(shí)間:2018年05月02日 11:17:02   作者:果凍想  
Struts2提供的文件上傳下載機(jī)制十分簡便,使得我們寫很少的代碼,下面這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)手冊(cè)之文件上傳的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

我們?cè)陂_發(fā)Web應(yīng)用時(shí),肯定要為用戶提供上傳的功能,比如用戶上傳一張圖像作為頭像等。為了能上傳文件,我們必須將表單的method設(shè)置為POST,將enctype設(shè)置為multipart/form-data。只有在這種情況下,瀏覽器才會(huì)把用戶選擇文件的二進(jìn)制數(shù)據(jù)發(fā)送給服務(wù)器。這篇文章就對(duì)Struts2框架中的上傳功能進(jìn)行詳細(xì)的總結(jié),下面話不多說了,來一起看看詳細(xì)的介紹吧。

Struts2的文件上傳

Struts2并未提供自己的請(qǐng)求解析器,也就是說,Struts2不會(huì)自己去處理multipart/form-data的請(qǐng)求,它需要調(diào)用其它上傳框架來解析二進(jìn)制請(qǐng)求數(shù)據(jù),但Struts2在原有的上傳解析器基礎(chǔ)上做了進(jìn)一步封裝,更進(jìn)一步簡化了文件上傳。

在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上傳文件時(shí)的上傳解析器。Struts2的封裝隔離了底層文件上傳組件的區(qū)別,開發(fā)者只要在此配置文件上傳所使用的解析器,就可以輕松地在不同的文件上傳框架之間切換。

Struts2默認(rèn)使用jakarta上傳解析器,當(dāng)然了,如果你不喜歡,你也可以換成別的。下面就通過代碼來實(shí)現(xiàn)一個(gè)簡單的基于Struts2的文件上傳功能。

實(shí)現(xiàn)文件上傳的Action

前臺(tái)頁面:

<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>

對(duì)于Action類中,包含了兩個(gè)特別的屬性:

  • uploadContentType
  • uploadFileName

這兩個(gè)屬性分別用于封裝上傳文件的文件名、上傳文件的文件類型。對(duì)于Struts2來說,如果Form表單中包含一個(gè)name屬性為xxx的文件域,則對(duì)應(yīng)的Action需要使用三個(gè)屬性來封裝該文件域的信息:

  • 類型為File的xxx屬性封裝了該文件域?qū)?yīng)的文件內(nèi)容;
  • 類型為String的xxxFileName屬性封裝了該文件域?qū)?yīng)的文件的文件名;
  • 類型為String的xxxContentType屬性封裝了該文件域?qū)?yīng)的文件的文件類型。

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

手動(dòng)實(shí)現(xiàn)文件過濾

很多時(shí)候,Web應(yīng)用不允許用戶自由上傳,我們需要對(duì)用戶上傳的文件類型,文件大小進(jìn)行限制,因此必須在文件上傳過程中進(jìn)行文件過濾。下面就先手動(dòng)實(shí)現(xiàn)上傳文件過濾。

在struts.xml中配置一個(gè)新的參數(shù),表示支持的上傳類型:

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

在Action中添加驗(yàn)證函數(shù):

// 進(jìn)行驗(yàn)證
@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;
}

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

攔截器實(shí)現(xiàn)文件過濾

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

配置fileUpload攔截器時(shí),可以為其指定兩個(gè)參數(shù):

  • allowedTypes:該參數(shù)指定允許上傳的文件類型,多個(gè)文件類型之間以英文逗號(hào)隔開
  • 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>

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

配置錯(cuò)誤信息

對(duì)于上傳出現(xiàn)錯(cuò)誤的情況,系統(tǒng)默認(rèn)都是提示英文的錯(cuò)誤信息,但是為了輸出國際化的提示信息,這就需要在國際化的資源配置文件中增加以下兩個(gè)key的消息定義:

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

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

文件上傳的常量配置

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

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

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

總結(jié)

這篇文章詳細(xì)的總結(jié)了Struts2中的文件上傳,內(nèi)容有點(diǎn)多,基本都是手冊(cè)上的內(nèi)容,也罷,就當(dāng)手冊(cè)了。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

最新評(píng)論

麦盖提县| 石景山区| 福鼎市| 独山县| 南岸区| 南岸区| 平和县| 成安县| 泾源县| 深圳市| 尚义县| 思南县| 区。| 云梦县| 枞阳县| 扶风县| 绥棱县| 罗江县| 皮山县| 泰来县| 广灵县| 承德县| 安西县| 宁城县| 佳木斯市| 宣恩县| 崇礼县| 双江| 稷山县| 玉溪市| 长丰县| 资溪县| 汤原县| 瑞金市| 大安市| 江城| 新津县| 三门县| 渝北区| 平罗县| 河东区|