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

Twi*_*ice 5 clojure ring

我需要根据需要即时创建excel文件,并使用clojure.ring通过响应将其提供给用户。

我使用docjure创建一个excel文件并将其写入输出流(请参见以下函数:https : //github.com/mjul/docjure/blob/master/src/dk/ative/docjure/spreadsheet.clj#L86) ,然后从中获得输出流piped-input-stream(请参阅https://github.com/ring-clojure/ring/blob/1.5.0/ring-core/src/ring/util/io.clj#L11)。

代码的相关部分:

(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"})))
Run Code Online (Sandbox Code Playgroud)

使用此功能,由于某些原因,我总是得到一个空的.xlsx文件。piped-input-stream在我可以将其用作响应主体之前,似乎已经结束。

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

ssj*_*ary 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))))
Run Code Online (Sandbox Code Playgroud)