2010-11-26 120 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