Snap:下载存储在数据库中的文件

时间:2013-10-16 16:03:45

标签: haskell http-headers haskell-snap-framework

我需要下载存储在数据库中的文件。 我相信snap有文件工具,可以帮助文件上传和下载,但它只处理驻留在文件系统上的文件。

我获得了关于快照IRC to writeBS函数的建议,以将数据推送到浏览器。 此外,我被告知要修改HTTP标头,以便浏览器将数据视为文件并带来保存/打开对话框。今天我得玩它并有更多问题。

到目前为止,我有这个:

getFirst :: AppHandler ()
getFirst = do
  modifyResponse $ setContentType "application/octet-stream"  -- modify HTTP header
  result <- eitherWithDB $ fetch (select [] "files")  -- get the file from db
  let doc = either (const []) id result  -- get the result out of either
      fileName = at "name" doc  -- get the name of the file
      Binary fileData  = at "blob" doc  -- get the file data
  writeBS fileData

请告诉我这是否是正确的做法?

它有效,但很少有东西丢失:

  • 如何将文件名和文件类型传递给浏览器?
  • 如何设置Content-Disposition

所以我需要能够设置这样的东西:

Content-Disposition: attachment; filename=document.pdf
Content-Type: application/pdf

我该怎么做?

1 个答案:

答案 0 :(得分:3)

您可以使用modifyResponse结合setHeader(来自Snap.Core)设置响应的任意标头。像这样:

modifyResponse $ setHeader "Content-disposition" "attachment; filename=document.pdf"