You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.2 KiB
Clojure
39 lines
1.2 KiB
Clojure
(ns asciinema.component.local-file-store
|
|
(:require [asciinema.boundary.file-store :as file-store]
|
|
[clojure.java.io :as io]
|
|
[ring.util.http-response :as response]))
|
|
|
|
(defrecord LocalFileStore [base-path]
|
|
file-store/FileStore
|
|
|
|
(put-file [this file path]
|
|
(let [path (str base-path path)]
|
|
(io/make-parents path)
|
|
(io/copy file (io/file path))))
|
|
|
|
(put-file [this file path size]
|
|
(file-store/put-file this file path))
|
|
|
|
(input-stream [this path]
|
|
(let [path (str base-path path)]
|
|
(io/input-stream path)))
|
|
|
|
(move-file [this old-path new-path]
|
|
(let [old-path (str base-path old-path)
|
|
new-path (str base-path new-path)]
|
|
(.renameTo (io/file old-path) (io/file new-path))))
|
|
|
|
(delete-file [this path]
|
|
(let [path (str base-path path)]
|
|
(io/delete-file path)))
|
|
|
|
(serve-file [this ctx path {:keys [filename]}]
|
|
(let [path (str base-path path)
|
|
response (assoc (:response ctx) :body (io/file path))]
|
|
(if filename
|
|
(update response :headers assoc "content-disposition" (str "attachment; filename=" filename))
|
|
response))))
|
|
|
|
(defn local-file-store [{:keys [path]}]
|
|
(->LocalFileStore path))
|