提供された previewServlet.java は、Efwフレームワークにおけるサーバー上のファイルのプレビュー機能を実現する専用のサーブレットです。
このサーブレットは、クライアントにファイルをダウンロードさせることなく、ブラウザ内で直接表示させることを目的としており、その処理はセキュリティとファイルサイズ制限に重点を置いています。
🖼️ previewServlet.java の分析:ファイルプレビュー処理
1. 役割と呼び出し方法
- 役割: サーバーサイドのイベント処理(JavaScript)で指定されたファイルをセッションから読み出し、MIMEタイプを設定してHTTPレスポンスストリームに直接書き出すことで、ブラウザにファイルをインライン表示(プレビュー)させます。
- アノテーション:
@WebServlet(name="previewServlet", urlPatterns={"/previewServlet"})により、専用のURLエンドポイントとして動作します。 - HTTPメソッド:
doGetのみで処理されます。クライアントは通常、JavaScriptを介してこのURLにリクエストを送信します。
2. 処理フロー (doGet)
A. プレビュー情報の取得とセッションクリア
- セッションから取得: プレビュー対象のファイルパス(
EFW_PREVIEW_FILE)とそのパスが絶対パスか否か(EFW_PREVIEW_ISABS)をHttpSessionから取得します。 - 即時削除: 情報を取得した後、セキュリティと二重利用防止のため、セッション属性を直ちに削除 (
sn.removeAttribute) します。これにより、同じファイルを複数回リクエストしたり、外部から不正にアクセスしたりするリスクを軽減します.
B. 厳格なファイルチェック
ファイルへのアクセス前に、以下のチェックを実行します。
- パス存在チェック: セッション属性がない場合、または空の場合、エラーを返します。
- ファイル実在チェック:
- ファイルパスを
framework.getStorageFolder()と結合してFileオブジェクトを作成(絶対パスの場合はそのまま)。 !fl.exists()||!fl.isFile()を確認し、指定されたファイルが存在しない、またはディレクトリである場合はエラーを返します。
- ファイルパスを
- MIMEタイプチェック:
FileManager.getMimeTypeByFileName(fl.getName())を使ってMIMEタイプを取得します。- MIMEタイプが
"unknown"の場合、プレビュー不可としてエラーを返します(ブラウザが安全に表示できない可能性のあるファイルタイプを拒否)。
- サイズ制限チェック:
- ファイルサイズが 10MB (10 * 1024 * 1024 バイト) を超える場合、エラーを返します。これは、サーバーのメモリ負荷軽減と、大きなファイルのプレビューによるクライアント側のパフォーマンス低下を防ぐための措置です。
C. ファイルの読み込みとレスポンス
- コンテンツタイプ設定: 取得した
mimeTypeをresponse.setContentType(mimeType)に設定します。これにより、ブラウザはダウンロードダイアログではなく、インライン(内部)表示を試みます。 - ストリーム書き込み:
FileInputStreamとBufferedInputStreamを使用してファイル内容を読み込み、response.getOutputStream()を介してクライアントに直接バイナリデータとして書き込みます。
3. エラー処理 (outputError)
- ファイルが見つからない、サイズ超過、プレビュー不可などのエラーが発生した場合、
outputErrorメソッドが呼び出されます。 - レスポンスをリセットし、
text/htmlとしてエラーメッセージをHTML形式でクライアントに表示します。このメッセージには、I18nManager から取得した国際化されたエラーメッセージが含まれます。
4. サーバーサイドJSとの連携
previewServlet は、サーバーサイドJavaScript (efw.server.js:fire) と連携しています。
- JS側: イベント処理の結果 (
Result) にactions.previewが含まれている場合、efw.server.jsがファイルパス情報を取得し、セッションに保存します。 - クライアント側:
efw.client.jsがサーバーからのResultを受け取り、プレビュー用のURL(/previewServlet)へリクエストを送信します。 - Java側:
previewServletがそのセッションに保存された情報を利用してファイルを提供します。
これは、ファイルパスを直接URLパラメーターとして公開せず、セッションを介することでセキュリティを確保しつつファイルを提供するための、一般的な設計パターンです。