Oracle InterMedia 提供 OrdMultipartFilter 處理 multipart/form-data 請求,Tapestry 4 則有自身的 MultipartDecoderFilter。整合關鍵在於 請求包裝器識別與鏈式委派,避免重複解碼。
<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。
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();
}
}
<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>
<inject property="requestGlobals" object="service:tapestry.globals.RequestGlobals" />
<input type="file" name="upload"/>
<!-- 或 Tapestry upload 組件 -->
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() 釋放臨時檔案 |
/ord/*,其他路徑仍走 Tapestry 原生解碼OrdHttpUploadFile.release() 及時釋放此整合模式同樣適用於 Tapestry 5(對應 MultipartServletRequestFilter),核心思想不變:識別包裝器、避免重複解碼、統一資源清理。