如何确定正确的文件系统路径

4
我正在开发一个应用程序,需要下载一些外部资源,并通过Ring中的public/static目录进行访问。
然而,在我的应用程序中保存资源到静态目录时遇到了问题,当我在开发中使用ring-jetty-adapter时;测试和生产服务器运行Tomcat。
我在我的Leiningen项目中添加了:web-content"public",并在项目根目录下添加了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)))))

两者 :servlet:req 都是 nil

1个回答

1

ring-servlet source来看,环形servlet适配器将HttpServletHttpServletRequestHttpServletResponse对象与环形请求映射关联在:servlet:servlet-request:servlet-response键下。

它还为方便起见向请求映射添加了一个值为(.getServletContext servlet):servlet-context条目。

在处理程序内部,您可能希望检查请求映射中是否存在这些键,然后从相关对象中提取您需要的进一步信息。


好的,这就是我尝试做的事情: - drankard
(defn wrap-context-info [handler] (fn [req] (let [resp (handler req)] (assoc resp :servlet (:servlet req) :req (:servlet-request req))))) - drankard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接