2012-07-06 49 views
6

我使用Compojure在Clojure中创建了一个静态文件服务器,并且我一直在从文件系统读取图像并通过Compojure路径显示该图像。如何将二进制文件的内容读入Clojure中的字符串?

啜食遗憾的是不处理二进制数据非常好,我尝试了,因为这100点不同的方式,但是这是我最新的尝试失败:

(defn image-output [filepath] 
    (try 
    (let [contents (apply str (with-open [rdr (io/reader filepath)] 
     (into #{} (line-seq rdr))))] 
     { 
     :status 200 
     :headers 
     { 
      "Content-Type" "image/jpeg", 
      "Content-Length" "", 
      "Cache-Control" "", 
      "Expires" "" 
     } 
     :body contents 
     })) 
    (catch Exception e {:status 404}))) 

(defn endpoint_view [params] 
    (if (contains? params :bucket) 
    (image-output (join "/" [data_path (:bucket params) (:dir params) (:filename params)])))) 

(defroutes main-routes 
    (GET "/view/:bucket/:dir/:filename" {params :params} (endpoint_view params)) 
    (route/files "/") 
    (route/resources "/s" {:root "./public/s"}) 
    (route/not-found "Page not found")) 

看来这个当前的尝试遭遇了同样的命运作为使用slurp,我可以在其中回显内容字符串,它是和编码的字符串,但是当我将content-type更改为image/jpeg时,它是一个破碎的图像。

我昨天一整天都在Google上搜索,但没有一个例子完成了相同的目标,虽然他们帮助我更多地了解了Java IO,但他们还不够清楚,无法帮助我找到需要的地方,或者产生了与我相同的结果(例如:Best way to read contents of file into a set in Clojure)。

(!如果虚加分,你能告诉我怎么去从文件路径以及内容类型因为这是我的下一个问题)

回答

7

只是使身体成为(io/file filepath) - 环是非常乐意为文件您。

编辑奖励积分:您可以使用ring.middleware.file-info/wrap-file-info获取您返回的文件的文件元数据。或者,您可以使用(compojure.route/files "/public")服务于一个完整的目录,为您解决所有这些问题。

+1

那该死的。您是正确的先生! 我仍然有兴趣知道如何读取二进制数据到一个字符串,虽然我杀了一天试图找出它,但这解决了我眼前的问题。谢谢! – 2012-07-06 19:33:58

+3

不要这样做。字符串不是二进制的,没有什么好的结果。 – amalloy 2012-07-06 21:07:53

相关问题