2012-07-06 74 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

相關問題