2

我想从 Hunchentoot (SBCL) 的网络调用中返回一个 TSV 文件,但希望用户只将原始结果保存到页面,而不是使用单独的文件和下载链接(由于本地防火墙的复杂性,这很难)。

我无法弄清楚如何在没有任何标题的情况下输出页面,即使其只是纯原始文本。(我知道浏览器会在没有 DOM 的标题的情况下弄得一团糟,但不在乎;目标只是让用户保存页面,而不是阅读它。)

我尝试了各种组合

(setf (hunchentoot:content-type*) "text/plain")

(cl-who:with-html-output-to-string                                                                                            
          (*standard-output* nil :prologue nil)

并在内部,外部和周围设置内容类型* ...但我总是得到标题垃圾。

4

2 回答 2

4

直接写字符串

我尝试如下定义一个处理程序:

(define-easy-handler (text :uri "/text") ()
  (setf (content-type*) "text/csv")
  "a,b,c")

当我在本地访问页面时,浏览器会自动下载一个文本文件,甚至不显示(这可能是我们在 Chrome 中可以更改的设置,我不知道)。

当我启用浏览器开发者模式时,以下是我收到的作为 HTTP 协议一部分的响应标头:

HTTP/1.1 200 OK
Server: ...
Date: ...
Content-Type: text/csv; charset=utf-8
Content-Length: 5
Connection: keep-alive

但文件本身只是字符串a,b,c

如果我将 content-type 更改为"text/plain",则浏览器会成功显示文本,而不会显示其他内容(HTTP 标头相同)。

评论

cl-who如果您不打算构建 HTML 文档,则不需要使用宏,实际上最好不要。REPLY-CLASS在任何情况下,您都可以在初始化接受者时提供自己的内容(请参阅https://edicl.github.io/hunchentoot/#replies),并对您作为回复发出的内容(包括标题)进行非常低级的控制。但我认为这在你的情况下是不必要的。我不清楚你的问题来自哪里,但是发回纯文本是框架应该能够开箱即用的东西。如果可以,请添加更多详细信息。

于 2020-11-24T23:01:25.710 回答
0

不使用Content-Disposition标头的正确答案是什么?

于 2020-11-26T21:48:56.310 回答