2012-07-04 10 views
16

Próbuję zapisać plik pobrany za pomocą clj-httpZapisywanie formie obrazu wniosek CLJ-http do pliku

Mam następujący kod:

(def test-file 
    (cl/get "http://placehold.it/350x150")) 

(defn write-file [] 
    (with-open [w (clojure.java.io/writer "test-file.gif" :append true)] 
(.write w (:body test-file)))) 

a kiedy starają się ją jako bajt -array, otrzymuję wyjątek:

 user=>  (def test-file 
        (cl/get "http://placehold.it/350x150" {:as :byte-array})) 
     #'user/test-file 
     user=> (write-file) 
     IllegalArgumentException No matching method found: write for class java.io.BufferedWriter clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:79) 

Pomoc!

+0

Chociaż można użyć CLJ-http , można to zrobić wyłącznie za pomocą c lojure.java.io: http://stackoverflow.com/q/15628682/425313 –

Odpowiedz

25

użyć wyjścia binarnego.

(def test-file 
    (client/get "http://placehold.it/350x150" {:as :byte-array})) 

(defn write-file [] 
    (with-open [w (java.io.BufferedOutputStream. (java.io.FileOutputStream. "test-file.gif"))] 
    (.write w (:body test-file)))) 

Edit: wyjściowy strumień jest lepsze:

(defn write-file [] 
    (with-open [w (clojure.java.io/output-stream "test-file.gif")] 
    (.write w (:body test-file)))) 

Aktualizacja:

elegancki sposób:

(clojure.java.io/copy 
(:body (client/get "http://placehold.it/350x150" {:as :stream})) 
(java.io.File. "test-file.gif")) 
+0

świetnie! to działa dla mnie – zcaudate

+0

Co ważniejsze, writer.write oczekuje, że char [] i outputstream.write spodziewają się bajtu [] – Kevin

+5

Ale prawdopodobnie powinieneś używać clojure.java.io/output-stream – Kevin