使用Kemal设置HTTP响应标头

时间:2017-05-17 01:33:36

标签: http crystal-lang kemal

我希望在凯末尔实施this answer

我当前的设置在app/public/map.pdf中有一个pdf文件,以及我的主水晶文件中的以下代码:

require "kemal"

#...

get "/map.pdf" do |env|
    env.response.headers["Content-Type"] = "application/pdf"
    env.response.headers["Content-Disposition"] = %(inline;filename="myfile.pdf")
end

Kemal.run

当我通过在浏览器(firefox)中打开localhost:3000/map.pdf来测试我的代码时,它会提示下载文件(我希望它尝试显示它)。 curl -I会产生以下结果:

HTTP/1.1 200 OK
Connection: keep-alive
X-Powered-By: Kemal
Content-Type: application/octet-stream
ETag: W/"1494983019"
Content-Length: 1170498

我希望看到Content-Type: application/pdf

2 个答案:

答案 0 :(得分:1)

凯末尔这里的作者,

如果标题没问题,那么你应该选择send_file。但请确保路由名称和文件不相同。在这种情况下,路线为/pdf

get "/pdf" do |env|
  env.response.headers["Content-Type"] = "application/pdf"
  env.response.headers["Content-Disposition"] = %(inline;filename="map.pdf")
  send_file env, "./public/map.pdf"
end

答案 1 :(得分:-2)

  

我希望看到Content-Type:application / pdf。

关键是Content-Disposition不作为标题存在。 也许你出于某种原因根本不发送任何标题。

例如在PHP中,如果您的脚本在发送标头之前输出单个字节,则不会发送标头;只有第一个输出之前的标题。 如果在发送一些数据后设置了http标头,那么标头将被忽略。