首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Tapestry 4 整合 Oracle InterMedia 實戰:多部分請求解碼與檔案上傳處理

     編輯:Oracle 資料庫基礎

整合架構概覽

Oracle InterMedia 提供 OrdMultipartFilter 處理 multipart/form-data 請求,Tapestry 4 則有自身的 MultipartDecoderFilter。整合關鍵在於 請求包裝器識別與鏈式委派,避免重複解碼。

步驟一:配置 InterMedia Filter

<filter>
  <filter-name>interMediaFilter</filter-name>
  <filter-class>oracle.ord.im.OrdMultipartFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>interMediaFilter</filter-name>
  <url-pattern>/ord/*</url-pattern>
</filter-mapping>

攔截 /ord/* 路徑,將請求包裝為 OrdMultipartWrapper。

步驟二:自訂 MultipartDecoderFilter 避免雙重解碼

public void service(HttpServletRequest request,
                    HttpServletResponse response,
                    ServletRequestServicer servicer)
    throws IOException, ServletException {
    String contentType = request.getContentType();
    boolean encoded = contentType != null && contentType.startsWith("multipart/form-data");

    HttpServletRequest newRequest = null;
    try {
        // 關鍵判斷:已被 InterMedia 包裝則直接使用
        if (request instanceof HttpServletRequestWrapper) {
            newRequest = request;
        } else {
            newRequest = encoded ? _decoder.decode(request) : request;
        }
        servicer.service(newRequest, response);
    } finally {
        if (encoded) _decoder.cleanup();
    }
}

步驟三:HiveMind 服務配置替換預設解碼器

<implementation service-id="tapestry.multipart.ServletMultipartDecoderFilter">
  <invoke-factory>
    <construct class="org.MyMultipartDecoderFilter">
      <set-service property="decoder" service-id="tapestry.multipart.ServletMultipartDecoder"/>
    </construct>
  </invoke-factory>
</implementation>

步驟四:頁面與元件層使用上傳檔案

頁面類注入 RequestGlobals

<inject property="requestGlobals" object="service:tapestry.globals.RequestGlobals" />

HTML 表單使用檔案上傳元件

<input type="file" name="upload"/>
<!-- 或 Tapestry upload 組件 -->

頁面類取得 InterMedia 上傳檔案物件

RequestGlobals obj = this.getRequestGlobals();
OrdMultipartWrapper wrapper = (OrdMultipartWrapper) obj.getRequest();
OrdHttpUploadFile[] files = wrapper.getFileParameterValues("upload");
// 後續處理:files[0].loadVideo()、loadAudio()、loadImage() 等

關鍵技術點總結

環節核心邏輯
Filter 順序InterMedia Filter 先於 Tapestry Filter 執行(web.xml 定義順序)
請求識別instanceof HttpServletRequestWrapper 判斷是否已包裝
解碼委派未包裝則委派 Tapestry MultipartDecoder,包裝則直接透傳
資源清理finally 區塊確保 _decoder.cleanup() 釋放臨時檔案

常見坑點與解決

  • 雙重解碼導致輸入流耗盡:本方案透過 Wrapper 識別完美解決
  • URL 模式衝突:InterMedia 僅攔截 /ord/*,其他路徑仍走 Tapestry 原生解碼
  • 大檔案記憶體壓力:InterMedia 支援臨時檔案存儲,配合 OrdHttpUploadFile.release() 及時釋放

此整合模式同樣適用於 Tapestry 5(對應 MultipartServletRequestFilter),核心思想不變:識別包裝器、避免重複解碼、統一資源清理。

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