我需要根据请求创建excel文件,并使用clojure.ring通过响应将其提供给用户。
我使用https://github.com/mjul/docjure/blob/master/src/dk/ative/docjure/spreadsheet.clj#L86创建一个excel文件并将其写入输出流
(请参阅此函数:https://github.com/ring-clojure/ring/blob/1.5.0/ring-core/src/ring/util/io.clj#L11),然后使用piped-input-stream
获取输出流(请参阅{{3}})。
代码的相关部分:
(defn excel-response
[params]
(-> (response (piped-input-stream (fn [out-stream]
(create-excel-into-stream out-stream
params))))
(assoc :headers {"Content-Type"
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"})))
使用此函数,出于某些原因,我总是得到一个空的.xlsx文件。
似乎piped-input-stream
关闭之前我可以将其作为我的回复主体。
如何正确使用它,以便我可以写入输出流,将其传递给输入流,然后作为响应体?
答案 0 :(得分:0)
您的excel-response
功能对我来说是正确的,我以前写过非常相似的内容。你的create-excel-into-stream
函数是什么样的?
过去这对我有用。
(ns my.data.handler
(:require [clojure.data.csv :as csv]
[clojure.java.io :as io]))
(defn create-excel-into-stream
[out-stream params]
(let [excel-data (get-excel-data params)]
(with-open [writer (io/writer out-stream)]
(csv/write-csv writer excel-data))))