💾 Efwフレームワーク ファイルアップロード処理のまとめ
Efwフレームワークのファイルアップロード処理は、クライアント側でのリクエスト構築から、サーバー側での厳格なセキュリティチェックと永続化まで、複数のコンポーネントが連携して実現されます。この処理は、通常のイベント処理とは異なる専用のサーブレット(uploadServlet)を介して行われます。
1. クライアント側の役割: efw.client.js
efw.client.js は、通常のイベント実行 (fire) とは別に、ファイルアップロード専用の処理を担います。
| 役割 | 説明 |
|---|---|
| リクエストの準備 | Efw.prototype.upload など、ファイルアップロードをトリガーする関数が実行されます。この処理は、ファイルデータを含む multipart/form-data リクエストを構築します。 |
| パラメーターの付与 | ファイル本体の他に、サーバー側の処理に必要なメタ情報(cmd、id、target、home、isAbs、elFinderのパス配列 upload_path[] など)をフォームデータとして付与します。 |
| 送信先 | 構築したリクエストは、汎用的な efwServlet ではなく、バイナリデータ処理に特化した /uploadServlet へ直接送信されます。 |
2. サーバー側の役割: 受付・セキュリティ層 (uploadServlet.java)
uploadServlet.java は、ファイルデータを受け取るための専用ゲートウェイであり、セキュリティとI/Oを管理します。
🛡️ 厳格なセキュリティチェック(Java)
ファイルアップロードという高リスクな処理に対し、リクエスト解析前に以下のセキュリティチェックをJava側で実行します。
- ログインチェック: セッションの
loginKeyを確認し、非ログインユーザーからのアップロードを拒否します。 - 認可チェック: ユーザーの権限設定(
authKey)に基づき、アップロードを許可する権限 (uploadable="true") を持つユーザーからのみ受け付けます。 - パスリスクチェック: アップロードパスやファイル名に、
..(パスの遡り)や不正なディレクトリ文字(\、/)がないかを検査し、ディレクトリトラバーサルなどのリスクを排除します。
⚙️ ファイルI/Oと管理
- 一時保存: 受信したファイルデータを読み取り、ファイル名のリスクチェックを行った後、サーバー上に安全な一時ファイル(
efw#####.tmp)として保存します。 - 管理登録:
FileManager.keepUploadFileを呼び出し、アップロードされたファイル名と一時ファイルパスをフレームワークの管理下に登録し、JavaScriptからの操作を可能にします。 - 処理委譲: elFinder連携の場合、I/O完了後に
ScriptManager.callFunction("elfinder_upload", ...)を呼び出し、永続化のビジネスロジックをJavaScriptに委譲します。
3. サーバー側の役割: 永続化・ロジック層 (JS)
一時保存されたファイルを永続的な場所へ移動させる処理や、イベント処理に伴うファイルのクリーンアップを行います。
A. elFinder連携による永続化 (elfinder_upload.js)
uploadServlet から呼び出されるこの関数は、ファイルアップロードの最終ロジックを担当します。
- 最終リスクチェック: JavaScript側で
elfinder_checkRiskを再度実行し、セキュリティを二重化します。 - ターゲットデコード: elFinder特有の Base64 エンコードされたターゲットパスをデコードし、保存先フォルダ(
targetFolder)を特定します。 - 永続化実行:
file.saveUploadFiles(targetFolder)を呼び出し、FileManagerが管理する一時ファイルを指定された永続フォルダへ移動(またはコピー)させます。
B. イベント処理後のクリーンアップ (efw.js / efw.server.js)
通常のイベント処理フローにファイルアップロードが伴う場合、ファイルは FileManager によって管理されます。
- 自動削除:
efw.jsのdoPostのfinallyブロックでPackages.efw.file.FileManager.removeUploadFiles()が呼び出されます。 - 役割: これにより、イベント処理内で永続化されなかった(または
elfinder_uploadなどで明示的に移動されなかった)一時ファイルが、リクエスト完了時に確実にサーバーから削除され、ディスクスペースの浪費やセキュリティリスクを防ぎます。
📊 ファイルアップロード処理の役割分担
| コンポーネント | 実行環境 | 主な役割 |
|---|---|---|
efw.client.js |
クライアント (ブラウザ) | リクエスト構築(multipart/form-data)、/uploadServlet への送信。 |
uploadServlet.java |
サーバー (Java) | セキュリティバリア(ログイン、認可、パスチェック)、I/O制御、一時ファイル保存。 |
elfinder_upload.js |
サーバー (JavaScript) | ターゲットパスデコード、一時ファイルから永続フォルダへの移動。 |
efw.js / FileManager |
サーバー (JS/Java) | リクエスト終了後の一時ファイルの自動削除(クリーンアップ)。 |