亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品激情自拍| 4438全国亚洲精品在线观看视频| 久久九九全国免费精品观看| 欧美性受xxxx白人性爽| 欧美巨乳在线观看| 国产精品视频导航| 国产精品久久久久久久美男| 欧美黄色片免费观看| 日韩欧美精品网址| 亚洲精选一区二区| 欧美大秀在线观看| 欧美专区在线观看| 久久精彩免费视频| 亚洲美女黄色片| 日韩av三级在线观看| 久久久久久久久电影| 中文字幕视频一区二区在线有码| 最近2019免费中文字幕视频三| 久久视频免费在线播放| 欧美人与性动交| 色无极亚洲影院| 亚洲高清在线观看| 亚洲成av人乱码色午夜| 伊人久久大香线蕉av一区二区| 亚洲精品久久久久久久久久久久| 精品欧美一区二区三区| 视频一区视频二区国产精品| 久久精品中文字幕| 日韩高清不卡av| 欧美亚洲另类在线| 国产一区二区久久精品| 欧美大片va欧美在线播放| 成人美女免费网站视频| 亚洲性线免费观看视频成熟| 国产成人av在线播放| 国产精品视频专区| 久热精品视频在线观看一区| 亚洲另类激情图| 2018日韩中文字幕| 亚洲国产成人精品久久久国产成人一区| 日本sm极度另类视频| 91在线免费网站| 亚洲日本中文字幕免费在线不卡| 日韩亚洲欧美中文在线| 国产亚洲精品久久久久久777| 亚洲精品456在线播放狼人| 亚洲免费视频网站| 亚洲欧美制服另类日韩| 色综合五月天导航| 国产精品久久久久秋霞鲁丝| 成人福利在线视频| 蜜臀久久99精品久久久久久宅男| 伊人久久大香线蕉av一区二区| 国产va免费精品高清在线| 亚洲免费影视第一页| 日韩中文在线中文网三级| 国产精品久久久久久久久借妻| 欧美黑人xxxx| 久久999免费视频| 2019中文字幕免费视频| 97国产精品久久| 国产精品一香蕉国产线看观看| 亚洲国产古装精品网站| 欧美理论电影网| 久久精品亚洲94久久精品| 国产精品自拍小视频| www国产精品com| 欧美性猛交丰臀xxxxx网站| 日韩av影片在线观看| 久久精品国产成人精品| 成人福利在线观看| 久久精品成人动漫| 日韩亚洲国产中文字幕| 91在线无精精品一区二区| 在线播放精品一区二区三区| www.午夜精品| 26uuu另类亚洲欧美日本一| 狠狠色香婷婷久久亚洲精品| 欧美高清视频在线| 日韩毛片在线观看| 国产精品日韩久久久久| 欧美老少做受xxxx高潮| 久久综合免费视频影院| 欧美制服第一页| 久久久久久国产精品三级玉女聊斋| 国产精品爽黄69天堂a| 国产美女精品视频免费观看| 亚洲在线免费看| 日韩欧美精品网址| 欧美激情在线观看视频| 中文字幕日韩精品在线| 欧美性xxxxxx| 国语自产偷拍精品视频偷| 成人黄色大片在线免费观看| 日韩欧美国产成人| 久久九九免费视频| 欧美极品少妇xxxxⅹ免费视频| 7m精品福利视频导航| 国产欧美日韩中文| 久久久久北条麻妃免费看| 亚洲国产一区二区三区四区| 亚洲国产日韩精品在线| 国产大片精品免费永久看nba| 55夜色66夜色国产精品视频| 一区二区三区动漫| 成人国产精品久久久久久亚洲| 欧美亚洲另类视频| 久久久国产精彩视频美女艺术照福利| 国产日本欧美一区二区三区在线| 欧美日韩免费一区| 国产精品亚洲аv天堂网| 欧美精品在线极品| 欧美亚洲日本黄色| 国产精品午夜一区二区欲梦| 亚洲国产精品久久| 欧美国产日产韩国视频| 456国产精品| 国产精品福利在线观看网址| 91在线精品播放| 亚洲精品一区二区三区婷婷月| 国产成人精品视频在线观看| 色噜噜狠狠狠综合曰曰曰| 九色精品美女在线| 成人黄色大片在线免费观看| 性色av一区二区三区免费| 国产欧美精品日韩精品| 久久影视电视剧免费网站清宫辞电视| 中文字幕日韩av电影| 日本高清久久天堂| 国产自产女人91一区在线观看| 久久精品亚洲国产| 久久久久久免费精品| 亚洲aa中文字幕| 国产精品久久久久免费a∨大胸| 上原亚衣av一区二区三区| 色妞色视频一区二区三区四区| 日韩免费观看视频| 91精品视频免费观看| 欧美性高跟鞋xxxxhd| 欧洲中文字幕国产精品| 狠狠躁夜夜躁人人爽超碰91| 韩国三级日本三级少妇99| 久久国产加勒比精品无码| 日韩有码在线播放| 日韩精品在线影院| 亚洲国产高清福利视频| 中文精品99久久国产香蕉| 亚洲国产精品成人精品| 成人情趣片在线观看免费| 国产精品999999| 亚洲人成电影网站色| 国产成人精品久久二区二区91| 久久午夜a级毛片| 国产在线98福利播放视频| 久久成人人人人精品欧| 成人免费看片视频| 亚洲乱码国产乱码精品精| 51视频国产精品一区二区| 国产精品久久久久免费a∨| 欧美猛交免费看| 精品国产欧美成人夜夜嗨| 亚洲欧美中文日韩在线| 97视频人免费观看| 亚洲成av人乱码色午夜|