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

Struts2 文件上傳深度解析(二):FileUploadInterceptor 內部機制

     編輯:Java 相關知識

整體架構

Struts2 本身不含文件上傳實現,而是通過攔截器整合 Commons FileUpload、COS 等開源庫。核心流程:

  1. Request 解析器:默認 JakartaMultiPartRequest(基於 Commons FileUpload),解析 multipart/form-data 請求,生成 FileItem 列表,按表單 name 分組存入 Map,文件先寫入臨時目錄
  2. FileUploadInterceptor:
    • 驗證:單文件大小、類型、擴展名
    • 構造三組參數注入 ActionContext:
      表單名 (File/Array/List)、表單名ContentType、表單名FileName
  3. ParametersInterceptor:將上述參數映射賦值給 Action 屬性
  4. Action 業務邏輯:從臨時文件拷貝至目標目錄
  5. 清理:執行後刪除臨時文件(日誌會顯示刪除記錄)

關鍵配置參數

參數說明默認值
struts.multipart.parserRequest 解析器jakarta
struts.multipart.saveDir臨時目錄Servlet 容器臨時目錄
struts.multipart.maxSize總上傳大小限制 (Byte)2097152 (2MB)
maximumSize單文件大小限制無
allowedTypesSet允許 MIME 類型(逗號分隔)無
allowedExtensionsSet允許擴展名(逗號分隔)無

struts.xml 配置示例

<action name="Upload" class="com.bond.action.UploadAction">
  <param name="savePath">/upload</param>
  <interceptor-ref name="fileUpload">
    <param name="maximumSize">10240000000</param>
    <param name="allowedTypesSet">application/zip,application/pdf,image/gif</param>
  </interceptor-ref>
  <interceptor-ref name="defaultStack"/> <!-- 必須保留,否則缺少參數映射 -->
</action>

Action 屬性約定

private File[] upload;              // 單文件用 File,多文件用 File[]/List<File>
private String[] uploadContentType; // MIME 類型
private String[] uploadFileName;    // 原始文件名
private String savePath;            // 目標保存路徑

常見坑點

  • defaultStack 已含 fileUpload,重複引用會導致攔截器執行兩次、臨時文件刪除兩次日誌
  • 大文件上傳無進度反饋,需結合 Ajax 輪詢或 WebSocket 實現進度條
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved