posts - 22, comments - 17, trackbacks - 0, articles - 15
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Struts 2多文件上傳

          Posted on 2008-05-15 10:42 碼農cz 閱讀(954) 評論(0)  編輯  收藏 所屬分類: As u
          很多應用都要求在一個界面中可以上傳多個文件,Struts 2框架也可以方便地支持多個文件同時上傳,一般可以使用數組和List來實現。

           使用數組上傳多個文件

          1upload.jsp文件

           使用數組實現多個文件上傳的JSP

          <%@ page

              language="java"

              contentType="text/html; charset=UTF-8"

              pageEncoding="UTF-8"%>

          <%@ taglib prefix="s" uri="/struts-tags" %>

          <html>

          <head>

          <title>使用數組實現多個文件上傳</title>

          </head>

          <body>

          <s:form action="doMultipleUploadUsingArray" method="POST" enctype="multipart/form-data">

              <s:file label="文件1" name="upload" />

              <s:file label="文件2" name="upload" />

              <s:file label="文件3" name="upload" />

              <s:submit value="上傳"/>  

          </s:form>

          </body>

          </html>

          2)在該form中,定義了3個具有相同名稱的文件域,所以需要在Action實現類中使用數組來封裝這3個文件域。使用數組多個上傳文件的業務控制器如代碼

          使用數組上傳多個文件的業務控制器

          package ch11;

          import java.io.File;

          import java.text.DateFormat;

          import java.text.SimpleDateFormat;

          import java.util.Date;

          import java.util.Random;

          import org.apache.commons.io.FileUtils;

          import org.apache.struts2.ServletActionContext;

          import com.opensymphony.xwork2.ActionSupport;

          public class MultipleFileUploadUsingArrayAction extends ActionSupport {

              private File[] uploads;

              private String[] uploadFileNames;

              private String[] uploadContentTypes;

              private String[] dir;

              private String[] targetFileName;

              //屬性的gettersetter方法

              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;

              }

              //文件上傳

              public String upload() throws Exception {

                  // 獲得upload路徑的實際目錄

                  String realPath = ServletActionContext.getRequest().getRealPath(

                          "/upload");

                  //獲得實際目錄

                  String targetDirectory = realPath;

                  String[] mydir = new String[uploads.length];

                  String[] tname = new String[uploads.length];

                  for (int i = 0; i < uploads.length; i++) {

                      // 生成保存文件的文件名稱

                      tname[i] = generateFileName(uploadFileNames[i]);

                      // 保存文件的路徑

                      mydir[i] = targetDirectory + """" + tname[i];

                      // 建立一個目標文件

                      File target = new File(targetDirectory, tname[i]);

                      // 將臨時文件復制到目標文件

                      FileUtils.copyFile(uploads[i], target);

                  }

                  setDir(mydir);

                  setTargetFileName(tname);

                  return SUCCESS;

              }

              // 為上傳文件自動分配文件名稱,避免重復

              private String generateFileName(String fileName) {

                  // 獲得當前時間

                  DateFormat format = new SimpleDateFormat("yyMMddHHmmss");

                  // 轉換為字符串

                  String formatDate = format.format(new Date());

                  // 隨機生成文件編號

                  int random = new Random().nextInt(10000);

                  // 獲得文件后綴名稱

                  int position = fileName.lastIndexOf(".");

                  String extension = fileName.substring(position);

                  // 組成一個新的文件名稱

                  return formatDate + random + extension;

              }

              //屬性的gettersetter方法

              public String[] getDir() {

                  return dir;

              }

              public void setDir(String[] dir) {

                  this.dir = dir;

              }

              public String[] getTargetFileName() {

                  return targetFileName;

              }

              public void setTargetFileName(String[] targetFileName) {

                  this.targetFileName = targetFileName;

              }

          }

          說明

          使用數組上傳多個文件同上傳單個文件非常類似,并不復雜。

          3)在配置文件中增加如下配置:

          <action name="doMultipleUploadUsingArray"

                      class="ch11.MultipleFileUploadUsingArrayAction"

                      method="upload">

                      <result>/ch11/multipleUploadUsingArray-success.jsp</result>

                      <result name="input">/ch11/multipleUploadUsingArray.jsp</result>

          </action>

          4multipleUploadUsingArray-success.jsp的內容如代碼所示。

          代碼 multipleUploadUsingArray-success.jsp內容

          <%@ page

              language="java"

              contentType="text/html; charset=UTF-8"

              pageEncoding="UTF-8"%>

          <%@ taglib prefix="s" uri="/struts-tags" %>

          <html>

          <head>

          <title>多個文件上傳示例</title>

          </head>

          <body>

          <table border="1">

          <!-- 使用迭代標簽-->

          <s:iterator value="dir" status="stat">

          <tr>

              <td>文件名稱<s:property value="%{#stat.index}" /></td>

              <td><s:property value="%{dir[#stat.index]}" /></td>

          </tr>  

          </s:iterator>

          </table>

          <table border="1">

          <!-- 使用迭代標簽-->

          <s:iterator value="uploadContentType" status="stat">

          <tr>

              <td>文件類型<s:property value="%{#stat.index}" /></td>

              <td><s:property value="%{uploadContentType[#stat.index]}" /></td>

          </tr>

          </s:iterator>

          </table>

          <table border="1">

          <!-- 使用迭代標簽-->

          <s:iterator value="+targetFileName" status="stat">

          <tr>

              <td>圖片<s:property value="%{#stat.index}" /></td>

              <td><img src="<s:property value="'/bookcode/upload/'+targetFileName[#stat.index]"/>"/></td>

          </tr>

          </s:iterator>

          </table>

          </body>

          </html>

          5)運行該示例,在瀏覽器中輸入http://localhost:8080/TestS/multipleUpload UsingArray.jsp,界面如圖所示。

              使用數組上傳多個文件界面

          6)在這里,選擇3gif文件,單擊“上傳”按鈕,結果如圖

           使用數組上傳多個文件結果

           使用List上傳多個文件

          使用List來上傳多個文件同數組基本相同,上傳JSP文件和success邏輯視圖的JSP文件均不用修改,只是需要相應的Action實現類即可。

          主站蜘蛛池模板: 德格县| 玉龙| 康保县| 吉木乃县| 昌黎县| 昆明市| 贵州省| 丰镇市| 西畴县| 孝义市| 岳普湖县| 泰宁县| 安陆市| 临沧市| 遵义市| 元阳县| 香格里拉县| 屯门区| 巴中市| 卢湾区| 阜平县| 察雅县| 延津县| 吉安县| 卓资县| 雅江县| 津南区| 三门峡市| 安平县| 绿春县| 交城县| 溆浦县| 淳化县| 平顶山市| 涿鹿县| 新昌县| 崇左市| 金塔县| 历史| 波密县| 萨嘎县|