2012-07-06 9 views
6

मैं क्लोजर के साथ क्लोजर में एक स्थिर फ़ाइल सर्वर बना रहा हूं और मैं फाइल सिस्टम से एक छवि पढ़ने और एक छवि को कंपोज़र मार्ग के माध्यम से प्रदर्शित करने पर अटक गया हूं।क्लोजर में एक स्ट्रिंग में बाइनरी फ़ाइल की सामग्री कैसे पढ़ा जाए?

slurp दुर्भाग्य से बाइनरी डेटा बहुत अच्छी तरह से संभाल नहीं करता, और मैं के बाद से इस 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")) 

यह इस वर्तमान प्रयास यही हश्र ग्रस्त लगता है स्लर्प का उपयोग करने के रूप में, जहां मैं सामग्री स्ट्रिंग को प्रतिबिंबित कर सकता हूं और यह एन्कोडेड स्ट्रिंग है, लेकिन जब मैं सामग्री-प्रकार को छवि/जेपीईजी में बदलता हूं तो यह एक टूटी हुई छवि है।

मैंने कल पूरे दिन Google खोज की, लेकिन किसी भी उदाहरण ने एक ही लक्ष्य पूरा नहीं किया, और जब उन्होंने मुझे जावा आईओ के बारे में थोड़ा और समझने में मदद की, तो मुझे यह जानने में मदद करने के लिए पर्याप्त स्पष्ट नहीं था कि मुझे कहां जाना है , या उसी परिणाम का उत्पादन किया जो मुझे पहले से मिल रहा था (उदाहरण: Best way to read contents of file into a set in Clojure)।

(! काल्पनिक बोनस अंक अगर तुम मुझे बता सकता है कि रूप में अच्छी तरह filepath से सामग्री प्रकार प्राप्त करने के लिए के रूप में है कि मेरी अगली सवाल है)

उत्तर

7

बस यह शरीर (io/file filepath) हो - अंगूठी पूरी तरह से के लिए फ़ाइलों को सेवा करने के लिए खुश है आप।

बोनस अंक के लिए संपादित करें: आप लौटने वाली फ़ाइलों के लिए फ़ाइल मेटाडेटा प्राप्त करने के लिए ring.middleware.file-info/wrap-file-info का उपयोग कर सकते हैं। या, आप बस (compojure.route/files "/public") के साथ एक संपूर्ण निर्देशिका की सेवा कर सकते हैं, जो आपके लिए यह सब गड़बड़ करता है।

+1

अच्छा लानत। तुम सही हो महोदय! मुझे अभी भी एक स्ट्रिंग में बाइनरी डेटा को पढ़ने का तरीका जानने में दिलचस्पी होगी, हालांकि मैंने इसे समझने की कोशिश कर रहे एक दिन को मार डाला था, लेकिन यह मेरी तत्काल समस्या हल करता है। धन्यवाद! –

+3

ऐसा मत करो। स्ट्रिंग बाइनरी नहीं हैं, इससे कुछ भी अच्छा नहीं होगा। – amalloy

संबंधित मुद्दे