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

Struts 2 實戰:基於物理路徑的檔案上傳完整實現

     編輯:Java 相關知識

業務場景

在傳統 Struts 2 應用中,實現檔案上傳至伺服器物理磁碟路徑是常見需求。本文提供完整 Action 代碼示例,涵蓋檔案接收、重命名、串流寫入、異常處理及業務邏輯串聯。

核心實現代碼

public ActionForward add(ActionMapping mapping, ActionForm form,
                         HttpServletRequest request, HttpServletResponse response) {

    TruckBaseForm tbf = (TruckBaseForm) form;
    FormFile uploadFile = tbf.getFilename();
    String savedFileName = "";

    if (uploadFile.getFileName().trim().length() > 0) {
        // 生成唯一文件名:時間戳 + 原始副檔名
        long timestamp = new Date().getTime();
        String ext = uploadFile.getFileName().substring(
            uploadFile.getFileName().lastIndexOf("."));
        savedFileName = timestamp + ext;

        try {
            // 獲取 Web 應用根目錄物理路徑
            String realPath = getServlet().getServletContext().getRealPath("/");
            String targetDir = realPath + "truckimg\\"; // 注意:Windows 路徑分隔符
            
            // 確保目標目錄存在
            File dir = new File(targetDir);
            if (!dir.exists()) dir.mkdirs();

            // 串流複製
            try (InputStream in = uploadFile.getInputStream();
                 OutputStream out = new FileOutputStream(targetDir + savedFileName)) {
                
                byte[] buffer = new byte[8192];
                int bytesRead;
                while ((bytesRead = in.read(buffer)) != -1) {
                    out.write(buffer, 0, bytesRead);
                }
            } // try-with-resources 自動關閉串流 (Java 7+)

        } catch (Exception e) {
            e.printStackTrace(); // 生產環境建議使用日誌框架
            // 可拋出自定義業務異常或返回錯誤頁面
        }
    }

    // 後續業務邏輯:構建領域對象、持久化、查詢列表、轉向
    TruckBase tb = makeTruckBase(tbf, savedFileName);
    int truckId = Integer.parseInt(request.getParameter("truckid"));
    int result = tbSEV.saveTruckBase(tb);

    List list = tbSEV.getAllTruckBase(truckId);
    request.setAttribute("truckbaseList", list);
    
    list = (ArrayList) dataSEV.getDataDictionaryList();
    request.setAttribute("dataList", list);
    
    TruckCard td = tcSEV.getTruckCard(truckId);
    request.setAttribute("truckCardList", td);

    return mapping.findForward("add");
}

關鍵技術點解析

  1. FormFile 介面:Struts 2 封裝上傳檔案的標準介面,提供 getInputStream()、getFileName() 等方法。
  2. 物理路徑獲取:getServletContext().getRealPath("/") 取得部署根目錄絕對路徑,避免相對路徑部署差異。
  3. 檔案命名策略:時間戳 + 副檔名,簡單有效避免衝突;生產環境建議改用 UUID 或 雜湊值。
  4. 串流處理最佳實踐:使用 8KB 緩衝區分塊讀寫,配合 try-with-resources 確保資源釋放。
  5. 目錄自動建立:上傳前檢查並建立目標目錄,防止 FileNotFoundException。

安全與擴展建議

  • 檔案類型驗證:檢查 MIME 類型與副檔名白名單,防止惡意腳本上傳。
  • 大小限制:在 struts.xml 配置 maximumSize 或 Action 中攔截過大檔案。
  • 儲存分離:生產環境建議將上傳目錄移出 Web 應用根目錄,或使用獨立檔案伺服器/對象儲存 (OSS)。
  • 異步處理:大檔案上傳可引入佇列異步處理,提升響應速度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved