2010-10-21 168 views
4

我有以下途径定义:从数据库服务二进制文件用的Compojure

(require '[compojure.core :as ccore] 
     '[ring.util.response :as response]) 

(def *main-routes* 
    (ccore/defroutes avalanche-routes 
     (ccore/GET "/" [] "Hello World 2") 
     (ccore/GET "/images/:id" [id] (get-image-response id)))) 

在这个例子中,请求/的作品就像一个魅力和返回预期Hello World 2

一开始图像响应方法的定义如下:

(defn get-image-response 
    [id] 
    (let [record (db/get-image id false)] 
    (-> (response/response (:data record)) 
     (response/content-type (:content-type record)) 
     (response/header "Content-Length" (:size record))))) 

我得到一个404的,所以二进制文件的服务不做得比较工作呢。任何想法为什么?

编辑: 好的,这个问题涉及在/images/name.jpg上请求图像的事实。一旦我删除.jpg处理程序被调用。所以问题变成了什么,除了扩展名之外,我该如何匹配?

回答

3

在这种情况下,真正的答案是,有在Clojure中,CouchDB的库中的缺陷。该补丁可用on github here

归结为将{:as:byte-array}地图参数和值添加到通过clj-http发送到沙发api的请求。

我的代码中的另一个问题是ring并不真正知道如何处理字节数组。我只是将字节数组封装到java.io.ByteArrayInputStream中,而不是修补环。以下是处理下载的完整代码:

(defn get-image-response 
    [id] 
    (let [record (db/get-image id false)] 
    (-> (response/response (new java.io.ByteArrayInputStream (:data record))) 
     (response/content-type (:content-type (:content-type record))) 
     (response/header "Content-Length" (:size record))))) 
10

Compojure使用clout进行路由匹配。点字符在影响力路线中具有特殊意义。它表示一个令牌分隔符,类似于斜杠字符。以下字符在影响力方面都具有此含义:/ . , ; ?

这意味着,像"/images/:id"路由将不会因为imagesnamejpg每个匹配形式/images/name.jpg的URI表示在影响力单独的令牌。

为了匹配它,您可以根据您的需要以多种不同的方式组合您的路线。

如果所有的图像具有.jpg扩展,最容易做的事情是:

(GET "/images/:id.jpg" [id] ...) 

如果延伸而变化,你可以做到以下几点:

(GET "/images/:name.:extension" [name extension] ...) 

如果你想限制扩展名,你可以通过compojure/clout的正则表达式:

(GET ["/images/:name.:ext", :ext #"(jpe?g|png|gif)"] [name ext] ...) 

您也可以去使用通配符,这是不太精确,并会匹配任何URI开始/images/

(GET "/images/*" [*] ...) 
+0

谢谢您提供的信息,我为您投票,因为它是正确的并与我的问题有关。不幸的是,我真正的问题是clojure-couchdb库中的一个bug,我修补了它。我将在单独的答案中包含所有的细节,以便其他人可以参考它。 – 2010-10-21 20:18:40

相关问题