使用来自ring.utils.io的管道输入流来提供文件

时间:2016-10-13 13:12:16

标签: clojure ring

我需要根据请求创建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关闭之前我可以将其作为我的回复主体。

如何正确使用它,以便我可以写入输出流,将其传递给输入流,然后作为响应体?

1 个答案:

答案 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))))