У меня есть база данных, которая содержит изображения, и я хочу обработать эти изображения через несколько URL-адресов, желательно так:
foobar.com/items?id=whateverTheImageIdIsInTheDatabase.
Итак, я написал этот код:
(defn create-item-image []
(let [item-id (:id (:params req))
item
(find-by-id
"items"
(ObjectId. item-id)
)
file-location (str "resources/" item-id ".jpg")
]
(with-open [o (io/output-stream file-location)]
(let [
;; take the first image. The "image" function simply returns the data-url from the id of the image stored in (first (:images item))
img-string (get (str/split (image (first (:images item))) #",") 1)
img-bytes
(.decode (java.util.Base64/getDecoder) img-string)
]
;; write to a file with the name whateverTheImageIdIsInTheDatabase.jpg
(.write o img-bytes)
(.close o)
)
)
)
)
(defn image-handler [req]
(do
(prn "coming to image handler")
(create-item-image req)
;; send the resourc whateverTheImageIdIsInTheDatabase.jpg created above.
(assoc (resource-response (str (:_id (:params req)) ".jpg") {:root ""})
:headers {"Content-Type" "image/jpeg; charset=UTF-8"})
)
)
Но это не работает. Ресурсы сломаны. Это потому, что ресурс отправляется до создания файла? Как мне отправить ресурс на лету? Другая проблема с записью файла на диск заключается в том, что он должен оставаться там. Таким образом, если будет выполнено 1000 запросов на разные изображения, все 1000 файлов будут сохранены на сервере, что не требуется, поскольку они уже находятся в базе данных. В конечном счете, как я могу отправить эти изображения, сохраненные в виде URL-адресов данных, в виде файлов в ответе без необходимости сначала записывать их на диск?