首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

基於 Struts 1.2 實現動態多檔案上傳完整範例

     編輯:Java 相關知識

專案配置檔

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "https://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

struts-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" 
    "https://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
    <form-beans>
        <form-bean name="multiUploadForm" type="com.hb.struts.form.MultiUploadForm" />
    </form-beans>
    <action-mappings>
        <action
            attribute="multiUploadForm"
            name="multiUploadForm"
            path="/multiUpload"
            scope="request"
            type="com.hb.struts.action.MultiUploadAction"
            validate="false" />
    </action-mappings>
    <message-resources parameter="com.hb.struts.ApplicationResources" />
</struts-config>

前端頁面 (test.jsp) - 動態新增檔案欄位

<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib uri="https://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="https://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="https://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="https://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html>
<head>
    <title>multiUploadDemo</title>
    <script language="javascript">
        var num = 0;
        function upload() {
            document.getElementById("status").innerHTML = "檔案上傳中...";
            multiUploadForm.submit();
        }
        function additem(id) {
            var row = eval("document.all['" + id + "']").insertRow();
            if (row != null) {
                var cell = row.insertCell();
                var str = '<input type="file" name="uploadFile[' + num + '].file">' +
                          '<input type="button" value="刪除" onclick="deleteitem(this,\'tb\');">';
                cell.innerHTML = str;
            }
            num++;
        }
        function deleteitem(obj, id) {
            var curRow = obj.parentNode.parentNode;
            var rowNum = eval("document.all." + id).rows.length - 1;
            eval("document.all['" + id + "']").deleteRow(curRow.rowIndex);
        }
        function callback(msg) {
            document.getElementById("status").innerHTML = "檔案上傳完成...<br>" + msg;
        }
    </script>
</head>
<body bgcolor="#ffffff">
    <div id="status"></div>
    <html:form method="post" action="/multiUpload.do" enctype="multipart/form-data" target="hidden_frame">
        <table id="tb"></table>
    </html:form>
    <iframe name='hidden_frame' id="hidden_frame" style="display:none"></iframe>
    <input type="button" name="btnAddFile" value="Add File" onclick="additem('tb')"/>
    <input type="button" name="btnUpload" value="upload" onclick="upload()"/>
</body>
</html:html>

Form Bean 設計

UploadFile.java - 單一檔案封裝

package com.hb.struts.form;
import java.io.Serializable;
import org.apache.struts.upload.FormFile;

public class UploadFile implements Serializable {
    private FormFile file;

    public FormFile getFile() {
        System.out.println("run in uploadFile.getFile()");
        return file;
    }
    public void setFile(FormFile file) {
        this.file = file;
    }
}

MultiUploadForm.java - 動態列表管理

package com.hb.struts.form;
import java.util.ArrayList;
import java.util.List;
import org.apache.struts.action.ActionForm;

public class MultiUploadForm extends ActionForm {
    private List myFiles;

    public MultiUploadForm() {
        myFiles = new ArrayList();
        myFiles.add(new UploadFile()); // 預設一個空欄位
    }

    public List getMyFiles() {
        return myFiles;
    }

    // 關鍵:動態擴展列表以對應前端索引
    public UploadFile getUploadFile(int index) {
        int size = myFiles.size();
        if (index > size - 1) {
            for (int i = 0; i < index - size + 1; i++) {
                myFiles.add(new UploadFile());
            }
        }
        return (UploadFile) myFiles.get(index);
    }

    public void setMyFiles(List myFiles) {
        this.myFiles = myFiles;
    }
}

注意:getUploadFile(int index) 方法必須包含擴展邏輯,否則 Struts 自動填充屬性時會因索引越界報錯。

Action 處理上傳邏輯

package com.hb.struts.action;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.upload.FormFile;

public class MultiUploadAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form,
                                 HttpServletRequest request, HttpServletResponse response) {
        MultiUploadForm multiUploadForm = (MultiUploadForm) form;
        List myFiles = multiUploadForm.getMyFiles();
        String fileStr = "";

        for (int i = 0; i < myFiles.size(); i++) {
            UploadFile uploadFile = (UploadFile) myFiles.get(i);
            FormFile file = uploadFile.getFile();
            if (file == null) {
                System.out.println("file is null");
            } else {
                // 這裡可套用單檔上傳邏輯儲存檔案
                System.out.println("filename>>>>>>>>>>" + file.getFileName());
                System.out.println("file size>>>>>>>>>>" + file.getFileSize());
                fileStr += "filename:::" + file.getFileName() + " file size:::" + file.getFileSize();
            }
        }

        // 回傳 JavaScript 通知父視窗
        try {
            response.setHeader("ContentType", "text/html;charset=gbk");
            PrintWriter out = response.getWriter();
            out.write("<script>parent.callback('upload file success" + fileStr + "')</script>");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

關鍵點總結

  1. 前端動態生成:JavaScript 動態新增 <input type="file" name="uploadFile[索引].file">,索引從 0 遞增。
  2. Form Bean 索引屬性:getUploadFile(int index) 動態擴展 List 確保 Struts 能正確填充。
  3. Struts 1.2 檔案上傳:FormFile 介面提供 getFileName()、getFileSize()、getInputStream() 等方法。
  4. iframe 非同步提交:target="hidden_frame" 避免頁面跳轉,配合 JavaScript 回呼顯示結果。

本範例核心思想已完整呈現,實際專案中可擴充檔案類型驗證、大小限制、儲存路徑管理等功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved