Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何在环中将输入流作为响应发送?_Clojure_Inputstream_Clojurescript_Gridfs_Monger - Fatal编程技术网

Clojure 如何在环中将输入流作为响应发送?

Clojure 如何在环中将输入流作为响应发送?,clojure,inputstream,clojurescript,gridfs,monger,Clojure,Inputstream,Clojurescript,Gridfs,Monger,我有以下代码,其中我想在fetchitems函数中发送一个文件的InputStream,该函数处理路由/获取项 (defn id->image [image-id] (let [image (.getInputStream (gfs/find-by-id fs image-id))] image)) (defn item-resp [item] (assoc item :_id (str (:_id item)) :images (into [] (map

我有以下代码,其中我想在fetchitems函数中发送一个文件的InputStream,该函数处理路由/获取项

(defn id->image [image-id]
    (let [image (.getInputStream (gfs/find-by-id fs image-id))] image))

(defn item-resp [item]
  (assoc item :_id (str (:_id item))
         :images (into [] (map id->image (:image-ids item))))
  )

(defn fetch-items [req]
  (res/response 
   (map item-resp (find fs "items" {}))))

以下是我在客户端的请求,使用:

但我从客户那里得到的回应是:

[:failure :parse] [:response nil] [:status-text "No reader function for tag object.  Format should have been EDN"]
:original-text "{:_id \"5e63f5c591585c30985793cd\", :images [#object[com.mongodb.gridfs.GridFSDBFile$GridFSInputStream 0x22556652 \"com.mongodb.gridfs.GridFSDBFile$GridFSInputStream@22556652\"]]}{:_id \"5e63f5d891585c30985793d0\", :images [#object[com.mongodb.gridfs.GridFSDBFile$GridFSInputStream 0x266ae6c0 \"com.mongodb.gridfs.GridFSDBFile$GridFSInputStream@266ae6c0\"]]}{:_id \"5e63f5e891585c30985793d3\", ...
为什么回应会说格式应该是edn?如何在客户端提取此文件/图像

--编辑--

执行以下操作:

(IOUtils/toString image "utf-8")
返回一个大小为1594字节的字符串,该字符串比预期的图像大小小得多。 我认为这是因为它将文件对象转换为base64,而不是与之关联的实际数据块。


如何使它将实际的GridFS块转换为base64字符串而不是文件对象?

似乎您正在构建一个响应,并将对InputStream对象的引用直接放入响应中,而无需将流的内容编码为字节数组并序列化响应中的内容

您需要找到一种方法来读取流的内容并在响应中对其进行编码,或者将它们编码为base 64

另一方面,客户机似乎期待一个EDN响应,当它找到string对象时,它抱怨没有办法读取带有这样一个标记的对象

下面是一个简单的示例,说明如何读取带有标记文字的EDN字符串,您可以对其进行扩展,以便解码客户端中的图像注意:我在解码器中使用Java,您需要在JS上使用不同的实现:

defn b64解码[s] ->>解码java.util.Base64/getDecoder字符串。 def消息{:hello:world:msg base64str\sgv5lcbpdcb3jrcye=\} ;; 现在我们可以阅读上面添加base64str处理程序的EDN字符串 clojure.edn/read-string{:readers{'base64str b64decode}消息 ;; => {:你好:世界,:msg嘿,它工作了!}
什么是将InputStream转换为base64字符串的快速方法?请检查:链接代码或IOUtils/toString我的输入流utf-8似乎都不适用于GridFSDBInputStream,因为在这两种情况下,我为每个文件都获得相同的base64字符串,并且也不够长,无法成为图像。在您的代码示例中,函数id->image似乎不完整。检查您是否已将其实际更改为slurp输入流的内容,并使用count确定它是否如您所期望的那样大似乎所有这些方法都将文件对象转换为base64,而不是与文件对象关联的实际gridfs块。查看编辑以了解详细信息。
(IOUtils/toString image "utf-8")