我正在开发一个应用程序,它必须下载一些外部资源,并通过环形公共/静态目录访问它们。
但是..我在将资源保存到我的应用程序中的静态目录时遇到了问题,在开发时我使用了ring-jetty-adapter,test&生产服务器正在运行tomcat。
我添加了:web-content“public”到我的leiningen项目并在项目的根目录中添加了“public”目录,然后我有一个使用http-agent和duck-streams的下载功能:
(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时,它会在tomcat根目录中查找“public”目录,而不是在应用程序上下文路径下。
我尝试添加一个中间件包装器来确定上下文路径并从那里构建正确的保存路径,但我找不到任何方法来访问HttpServlet或确定应用程序是否在适配器中运行的方法在特定的环境下部署。
这里是包装器:
(defn wrap-context-info [handler] (fn [req] (let [resp (handler req)] (assoc resp :servlet (:servlet req) :req (:servlet-request req)))))
both:servlet和:req为nil。
答案 0 :(得分:1)
查看ring-servlet source,似乎环servlet适配器将HttpServlet
,HttpServletRequest
和HttpServletResponse
对象与{{1}下的环请求映射关联起来相应地,},:servlet
和:servlet-request
键。
为方便起见,它还会在请求地图中添加:servlet-response
条目,其值为:servlet-context
。
在处理程序中,您可能希望检查请求映射中是否存在这些键,然后从关联的对象中提取所需的更多信息。