2010-11-26 92 views
3

我正在研究一個應用程序,該應用程序必須下載一些外部資源並使其可通過環中的公用/靜態目錄進行訪問。我如何確定正確的文件系統路徑

但是..我有一個問題,將資源保存到我的應用程序的靜態目錄中,當開發我使用ring-jetty-adapter時,測試&生產服務器正在運行tomcat。

我說:網絡內容的「公共」我leiningen項目,並在項目的根目錄增加了「公共」目錄下,然後我一直在使用HTTP代理和鴨流的下載功能:

 
(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」目錄中。 但是當我使用warcat文件將其部署到tomcat時,它會在tomcat根目錄中查找「public」目錄,而不是在應用程序上下文路徑下查找。

我嘗試添加一箇中間件包裝來確定上下文路徑,並從那裏建立正確的保存路徑,但如果應用程序在適配器或者運行我找不到任何的方式來訪問的HttpServlet或一種方法來確定它是在特定的環境下部署的。

這裏包裝:

 

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

兩個:servlet和:REQ是零。

回答

1

綜觀ring-servlet source,看來該環的servlet適配器HttpServletHttpServletRequestHttpServletResponse對象與環形請求地圖下:servlet:servlet-request,和:servlet-response鍵,相應地相關聯。

爲方便起見,它還爲請求映射添加了:servlet-context條目,其值爲(.getServletContext servlet)

在您的處理程序中,您可能需要檢查請求圖中是否存在這些鍵,然後從關聯的對象中提取所需的更多信息。

+0

好這是我嘗試做: – drankard 2010-12-01 10:22:05