Skip to content

Instantly share code, notes, and snippets.

@philippkueng
Created April 28, 2014 16:35
Show Gist options
  • Save philippkueng/11377226 to your computer and use it in GitHub Desktop.
Save philippkueng/11377226 to your computer and use it in GitHub Desktop.
Fetch & write a binary file using Clojure and clj-http
(ns the-namespace.core
(:require [clj-http.client :as client]
[clojure.java.io :as io]))
(defn- fetch-photo!
"makes an HTTP request and fetches the binary object"
[url]
(let [req (client/get url {:as :byte-array :throw-exceptions false})]
(if (= (:status req) 200)
(:body req))))
(defn- save-photo!
"downloads and stores the photo on disk"
[photo]
(let [p (fetch-photo! (:url photo))]
(if (not (nil? p))
(with-open [w (io/output-stream (str "photos/" (:id photo) ".jpg"))]
(.write w p)))))
@hgalant
Copy link

hgalant commented Jun 23, 2017

Not too familiar with clj-http but assuming (:body req) yields a byte-array, as it seems, save-photo! can be easier and Java-interop-free with clojure.java.io/copy:

(defn- save-photo!
  "downloads and stores the photo on disk"
  [{:keys [url id] :as photo}]
 (some-> (fetch-photo! url) (io/copy (io/file "photos" id ".jpg"))))

Did not test, but looks okay.

@trickyBytes
Copy link

Great, thanks!

@viebel
Copy link

viebel commented Jul 22, 2022

Thank you. Very useful

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment