隨筆 - 6  文章 - 129  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(14)

          隨筆檔案(6)

          文章分類(467)

          文章檔案(423)

          相冊

          收藏夾(18)

          JAVA

          搜索

          •  

          積分與排名

          • 積分 - 827240
          • 排名 - 49

          最新評論

          閱讀排行榜

          評論排行榜

          在Struts2中實現文件上傳(二)

           發布者:[IT電子教育門戶]   

          發布運行應用程序,在瀏覽器地址欄中鍵入:http://localhost:8080/Struts2_Fileupload/FileUpload.jsp,出現圖示頁面:

           
          清單7 FileUpload頁面

          選擇圖片文件,填寫Caption并按下Submit按鈕提交,出現圖示頁面:

           
          清單8 上傳成功頁面

          更多配置
          在運行上述例子,如果您留心一點的話,應該會發現服務器控制臺有如下輸出:

          Mar 20 , 2007 4 : 08 : 43 PM org.apache.struts2.dispatcher.Dispatcher getSaveDir
          INFO: Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir
          Mar 20 , 2007 4 : 08 : 43 PM org.apache.struts2.interceptor.FileUploadInterceptor intercept
          INFO: Removing file myFile C:\Program Files\Tomcat 5.5 \work\Catalina\localhost\Struts2_Fileupload\upload_251447c2_1116e355841__7ff7_00000006.tmp 清單9 服務器控制臺輸出
          上述信息告訴我們,struts.multipart.saveDir沒有配置。struts.multipart.saveDir用于指定存放臨時文件的文件夾,該配置寫在struts.properties文件中。例如,如果在struts.properties文件加入如下代碼:

          struts.multipart.saveDir = /tmp 清單10 struts配置
          這樣上傳的文件就會臨時保存到你根目錄下的tmp文件夾中(一般為c:\tmp),如果此文件夾不存在,Struts 2會自動創建一個。

          錯誤處理
          上述例子實現的圖片上傳的功能,所以應該阻止用戶上傳非圖片類型的文件。在Struts 2中如何實現這點呢?其實這也很簡單,對上述例子作如下修改即可。

          首先修改FileUpload.jsp,在<body>與<s:form>之間加入“<s:fielderror />”,用于在頁面上輸出錯誤信息。

          然后修改struts.xml文件,將Action fileUpload的定義改為如下所示:

                  < action name ="fileUpload" class ="tutorial.FileUploadAction" >
                      < interceptor-ref name ="fileUpload" >
                          < param name ="allowedTypes" >
                              image/bmp,image/png,image/gif,image/jpeg
                          </ param >
                      </ interceptor-ref >
                      < interceptor-ref name ="defaultStack" />           
                      < result name ="input" > /FileUpload.jsp </ result >
                      < result name ="success" > /ShowUpload.jsp </ result >
                  </ action > 清單11 修改后的配置文件
          顯而易見,起作用就是fileUpload攔截器的allowTypes參數。另外,配置還引入defaultStack它會幫我們添加驗證等功能,所以在出錯之后會跳轉到名稱為“input”的結果,也即是FileUpload.jsp。

          發布運行應用程序,出錯時,頁面如下圖所示:

           
          清單12 出錯提示頁面

          上面的出錯提示是Struts 2默認的,大多數情況下,我們都需要自定義和國際化這些信息。通過在全局的國際資源文件中加入“struts.messages.error.content.type.not.allowed=The file you uploaded is not a image”,可以實現以上提及的需求。對此有疑問的朋友可以參考我之前的文章《在Struts 2.0中國際化(i18n)您的應用程序》。

          實現之后的出錯頁面如下圖所示:

           
          清單13 自定義出錯提示頁面

          同樣的做法,你可以使用參數“maximumSize”來限制上傳文件的大小,它對應的字符資源名為:“struts.messages.error.file.too.large”。

          字符資源“struts.messages.error.uploading”用提示一般的上傳出錯信息。

          多文件上傳
          與單文件上傳相似,Struts 2實現多文件上傳也很簡單。你可以將多個<s:file />綁定Action的數組或列表。如下例所示。

          < s:form action ="doMultipleUploadUsingList" method ="POST" enctype ="multipart/form-data" >
              < s:file label ="File (1)" name ="upload" />
              < s:file label ="File (2)" name ="upload" />
              < s:file label ="FIle (3)" name ="upload" />
              < s:submit />
          </ s:form > 清單14 多文件上傳JSP代碼片段
          如果你希望綁定到數組,Action的代碼應類似:

               private File[] uploads;
               private String[] uploadFileNames;
               private String[] uploadContentTypes;

               public File[] getUpload()  { return this .uploads; }
                public void setUpload(File[] upload)  { this .uploads = upload; }
           
                public String[] getUploadFileName()  { return this .uploadFileNames; }
                public void setUploadFileName(String[] uploadFileName)  { this .uploadFileNames = uploadFileName; }
           
                public String[] getUploadContentType()  { return this .uploadContentTypes; }
                public void setUploadContentType(String[] uploadContentType)  { this .uploadContentTypes = uploadContentType; } 清單15 多文件上傳數組綁定Action代碼片段
          如果你想綁定到列表,則應類似:

               private List < File > uploads = new ArrayList < File > ();
               private List < String > uploadFileNames = new ArrayList < String > ();
               private List < String > uploadContentTypes = new ArrayList < String > ();

               public List < File > getUpload()  {
                   return this .uploads;
              }
                public void setUpload(List < File > uploads)  {
                   this .uploads = uploads;
              }
           
                public List < String > getUploadFileName()  {
                   return this .uploadFileNames;
              }
                public void setUploadFileName(List < String > uploadFileNames)  {
                   this .uploadFileNames = uploadFileNames;
              }
           
                public List < String > getUploadContentType()  {
                   return this .uploadContentTypes;
              }
                public void setUploadContentType(List < String > contentTypes)  {
                   this .uploadContentTypes = contentTypes;
              } 清單16 多文件上傳列表綁定Action代碼片段
          總結
          在Struts 2中實現文件上傳的確是輕而易舉,您要做的只是使用<s:file />與Action的屬性綁定。這又一次有力地證明了Struts 2的簡單易用。



          posted on 2007-09-19 22:14 Ke 閱讀(2525) 評論(0)  編輯  收藏 所屬分類: struts 2
          主站蜘蛛池模板: 宁强县| 郴州市| 蒙山县| 霍州市| 保康县| 申扎县| 新闻| 天镇县| 苏尼特左旗| 长治市| 阿拉善右旗| 孟津县| 安陆市| 德化县| 法库县| 略阳县| 雅安市| 南召县| 响水县| 南投县| 尼木县| 龙南县| 辽宁省| 绿春县| 莒南县| 永年县| 新蔡县| 岐山县| 泰安市| 马龙县| 南漳县| 元谋县| 丹凤县| 大同市| 和龙市| 自贡市| 县级市| 行唐县| 怀远县| 宁波市| 海阳市|