在 SSH (Struts2 + Spring + Hibernate) 架構中,JSP 頁面上傳檔案時出現 404 錯誤,且僅在選擇檔案時發生,是典型的多部分請求(multipart/form-data)配置或攔截器順序問題。本文提供系統性排查步驟與解決方案。
<constant name="struts.multipart.maxSize" value="52428800" /> <!-- 50MB -->
<constant name="struts.multipart.parser" value="jakarta" /> <!-- 或 pell -->
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="profiling"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/> <!-- 必須在 params 之前 -->
<interceptor-ref name="checkbox"/>
<interceptor-ref name="datetime"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params"/> <!-- 參數填充 -->
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation"/>
<interceptor-ref name="workflow"/>
</interceptor-stack>
<s:form action="uploadAction" method="post" enctype="multipart/form-data">
<s:file name="uploadFile" label="選擇檔案"/>
<s:submit value="上傳"/>
</s:form>
public class UploadAction extends ActionSupport {
private File uploadFile; // 檔案對象
private String uploadFileFileName; // 原始檔名
private String uploadFileContentType; // MIME 類型
// Getter/Setter 略
public String execute() {
// 業務邏輯:儲存檔案、寫入資料庫等
return SUCCESS;
}
}
# log4j.properties
log4j.logger.org.apache.struts2.dispatcher.multipart=DEBUG
log4j.logger.com.opensymphony.xwork2.interceptor.FileUploadInterceptor=DEBUG
觀察控制台輸出,確認:
系統性檢查上述配置點,多數 SSH 檔案上傳 404 問題皆可解決。關鍵在於「請求能否完整到達 Action」與「multipart 解析器參數是否足夠」。