提供された previewServlet.java は、Efwフレームワークにおけるサーバー上のファイルのプレビュー機能を実現する専用のサーブレットです。

このサーブレットは、クライアントにファイルをダウンロードさせることなく、ブラウザ内で直接表示させることを目的としており、その処理はセキュリティとファイルサイズ制限に重点を置いています。


🖼️ previewServlet.java の分析:ファイルプレビュー処理

1. 役割と呼び出し方法

2. 処理フロー (doGet)

A. プレビュー情報の取得とセッションクリア

  1. セッションから取得: プレビュー対象のファイルパス(EFW_PREVIEW_FILE)とそのパスが絶対パスか否か(EFW_PREVIEW_ISABS)を HttpSession から取得します。
  2. 即時削除: 情報を取得した後、セキュリティと二重利用防止のため、セッション属性を直ちに削除 (sn.removeAttribute) します。これにより、同じファイルを複数回リクエストしたり、外部から不正にアクセスしたりするリスクを軽減します.

B. 厳格なファイルチェック

ファイルへのアクセス前に、以下のチェックを実行します。

  1. パス存在チェック: セッション属性がない場合、または空の場合、エラーを返します。
  2. ファイル実在チェック:
    • ファイルパスを framework.getStorageFolder() と結合して File オブジェクトを作成(絶対パスの場合はそのまま)。
    • !fl.exists()||!fl.isFile() を確認し、指定されたファイルが存在しない、またはディレクトリである場合はエラーを返します。
  3. MIMEタイプチェック:
    • FileManager.getMimeTypeByFileName(fl.getName()) を使ってMIMEタイプを取得します。
    • MIMEタイプが "unknown" の場合、プレビュー不可としてエラーを返します(ブラウザが安全に表示できない可能性のあるファイルタイプを拒否)。
  4. サイズ制限チェック:
    • ファイルサイズが 10MB (10 * 1024 * 1024 バイト) を超える場合、エラーを返します。これは、サーバーのメモリ負荷軽減と、大きなファイルのプレビューによるクライアント側のパフォーマンス低下を防ぐための措置です。

C. ファイルの読み込みとレスポンス

  1. コンテンツタイプ設定: 取得した mimeTyperesponse.setContentType(mimeType) に設定します。これにより、ブラウザはダウンロードダイアログではなく、インライン(内部)表示を試みます。
  2. ストリーム書き込み: FileInputStreamBufferedInputStream を使用してファイル内容を読み込み、response.getOutputStream() を介してクライアントに直接バイナリデータとして書き込みます。

3. エラー処理 (outputError)

4. サーバーサイドJSとの連携

previewServlet は、サーバーサイドJavaScript (efw.server.js:fire) と連携しています。

  1. JS側: イベント処理の結果 (Result) に actions.preview が含まれている場合、efw.server.js がファイルパス情報を取得し、セッションに保存します。
  2. クライアント側: efw.client.js がサーバーからの Result を受け取り、プレビュー用のURL(/previewServlet)へリクエストを送信します。
  3. Java側: previewServlet がそのセッションに保存された情報を利用してファイルを提供します。

これは、ファイルパスを直接URLパラメーターとして公開せず、セッションを介することでセキュリティを確保しつつファイルを提供するための、一般的な設計パターンです。