2012-07-04 18 views
16

que estoy tratando de guardar un archivo descargado usando clj-httpGuardar una petición CLJ-http forma de imagen a presentar

Tengo el siguiente código:

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

y cuando intento para que sea como un byte -array, obtengo una excepción:

 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) 

¡Ayuda!

+0

Aunque puede utilizar CLJ-http , esto se puede hacer puramente con c lojure.java.io: http://stackoverflow.com/q/15628682/425313 –

Respuesta

25

usar salida binaria.

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

Editar: salida de corriente es mejor:

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

Actualización:

una manera elegante:

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

¡genial! funciona para mí – zcaudate

+0

Más al punto, writer.write espera char [] y outputstream.write espera byte [] – Kevin

+5

Pero probablemente debería usar clojure.java.io/output-stream – Kevin

Cuestiones relacionadas