Skip to content

Instantly share code, notes, and snippets.

@philippkueng
Created April 28, 2014 16:35
Show Gist options
  • Select an option

  • Save philippkueng/11377226 to your computer and use it in GitHub Desktop.

Select an option

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)))))
@benwhorwood
Copy link
Copy Markdown

Thanks, just what I needed for downloading and writing images from the PrestaShop web service.

@hgalant
Copy link
Copy Markdown

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
Copy Markdown

Great, thanks!

@viebel
Copy link
Copy Markdown

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