2

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

我得到了有关 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

我怎样才能做到这一点?

4

1 回答 1

3

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

modifyResponse $ setHeader "Content-disposition" "attachment; filename=document.pdf"
于 2013-10-16T18:16:43.543 回答