我需要下载存储在数据库中的文件。 我相信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
我该怎么做?
答案 0 :(得分:3)
您可以使用modifyResponse
结合setHeader
(来自Snap.Core
)设置响应的任意标头。像这样:
modifyResponse $ setHeader "Content-disposition" "attachment; filename=document.pdf"