2012-07-06 20 views
6

Clojure ile Compojure'da bir statik dosya sunucusu oluşturuyorum ve dosya sisteminden bir görüntü okumak ve bu görüntüyü bir Compojure yolu ile görüntülemek üzereyim.Bir ikili dosyanın içeriğini Clojure'daki bir dizeye nasıl okunur?

slurp maalesef çok iyi ikili veri işlemez, ve o zamandan beri bu 100 farklı yollar denedim ama bu benim son başarısız girişimi:

(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")) 

Bu akım girişimi aynı kaderi uğrar görünüyor içerik dizgisini ve onun ve kodlanmış dizeyi ekleyebileceğimiz slurp kullanarak, ancak içerik türünü görüntü/jpeg olarak değiştirdiğimde kırık bir görüntüdür.

Bütün gün dün Google'da arama yaptım, ancak örneklerin hiçbiri aynı amacı gerçekleştiremedi ve Java IO hakkında biraz daha fazla bilgi edinmelerine yardımcı olurken, gitmem gereken yere ulaşmama yardımcı olacak kadar net değildiler ya da zaten elde ettiğim aynı sonuçları ürettim (örnek: Best way to read contents of file into a set in Clojure). (! O benim sonraki soru olarak nasıl yanı filepath gelen içerik türünü almak için bana söyleyebilir Hayali bonus puan ise)

cevap

7

Sadece yapmak vücut (io/file filepath) olmak - Halka için dosyaları hizmet etmek gayet mutlu olduğunu sen.

Bonus puanları için düzenleme yapın: Döndüğünüz dosyalar için dosya meta verileri almak için ring.middleware.file-info/wrap-file-info'u kullanabilirsiniz. Veya, tüm bu karışıklık sizin için (compojure.route/files "/public") ile bir dizin hizmet verebilir.

+1

İyi lanet olsun. Siz doğru efendim! İkili verileri bir dizeye nasıl okuyacağımı bilmemle ilgilenirdim, ancak bir gün onu anlamaya çalışırken öldürdüğümde, bu benim acil sorunumu çözüyor. Teşekkürler! –

+3

Yapma. Dizeler ikili değil, bunun iyi bir tarafı olmayacak. – amalloy

İlgili konular