Как создать файловый ресурс на лету в Clojure? - PullRequest
0 голосов
/ 26 марта 2020

У меня есть база данных, которая содержит изображения, и я хочу обработать эти изображения через несколько 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-адресов данных, в виде файлов в ответе без необходимости сначала записывать их на диск?

1 Ответ

2 голосов
/ 26 марта 2020

Ресурсы - это статичные c файлы, которые не меняются при запуске приложения, и они упаковываются в uberjar при компиляции сервера для работы.

Если вы хотите отправить изображение в ответ, просто конвертируйте отправьте его в байтовый массив и отправьте в теле ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...