4

public/staticいくつかの外部リソースをダウンロードし、Ringのディレクトリからアクセスできるようにする必要があるアプリケーションに取り組んでいます。

しかし..アプリケーションの静的ディレクトリにリソースを保存する際に問題がありring-jetty-adapterます。テスト サーバーと運用サーバーは Tomcat を実行しています。

:web-content "public"leiningen プロジェクトに追加し、プロジェクトpublicのルートにディレクトリを追加すると、http-agent とダック ストリームを使用したダウンロード機能があります。

(defn download
  [file-name url]
  (h/http-agent url
                :handler (fn [agnt]
                           (let [fname file-name]
                             (with-open [w (d/writer fname)]
                               (d/copy (h/stream agnt) w))))))

REPL から Jetty を起動して を使用するsavepath: "public/my.file"と、ダウンロードしたファイルがディレクトリに正しく配置されますpublic。しかし、.warファイルを使用して Tomcatにデプロイするとpublic、アプリケーション コンテキスト パスの下ではなく、Tomcat ルート ディレクトリ内のディレクトリが検索されます。

HttpServletミドルウェア ラッパーを追加してコンテキスト パスを特定し、そこから正しい保存パスを作成しようとしましたが、にアクセスする方法や、アプリケーションがアダプターで実行されているかどうか、またはアプリケーションが下にデプロイされているかどうかを判断する方法が見つかりません。特定のコンテキスト。

ここでラッパー:

(defn wrap-context-info [handler]
  (fn [req]
    (let [resp (handler req)]
      (assoc resp :servlet (:servlet req) :req (:servlet-request  req)))))

両方:servletとも:reqですnil

4

1 に答える 1

1

ring-servlet sourceを見ると、リング サーブレット アダプタはHttpServlet、 、HttpServletRequest、およびオブジェクトを、、およびキーのHttpServletResponse下のリング リクエスト マップに関連付けているように見えます。:servlet:servlet-request:servlet-response

また、便宜上:servlet-contextの値を持つエントリをリクエスト マップに追加します。(.getServletContext servlet)

ハンドラー内で、リクエスト マップにこれらのキーが存在するかどうかを確認し、関連するオブジェクトから必要な追加情報を取得することができます。

于 2010-11-26T13:18:40.730 に答える