我需要了解使用Snap的文件上传过程。
鉴于此形式:
<form id="form" action="/files/upload" method="POST" enctype="multipart/form-data">
<input type="file" id="files" name="files[]" multiple />
<button type="submit" onclick="handleFiles(e)">Upload</button>
</form>
我是否使用相同的函数(如getPostParams)来处理二进制文件,还是使用Snap.Util.FileUploads中的函数?
我需要在数据库中上传和保存像PDF这样的二进制文件。数据库驱动程序将接受ByteString来存储二进制文件。
我浏览了Snap.Util.FileUploads,但它看起来并不像我需要的那样。 所以我不知道如何在处理程序中处理这个?
感谢。
修改
在IRC的帮助下,我设法提出了以下结构。我认为应该接近正确吗?好吧,它编译并将文件转储到mongodb。我也可以读回来。虽然我不太了解普查员和Iteratee的东西......
handleFiles :: AppHandler ()
handleFiles = do
[file] <- handleMultipart defaultUploadPolicy $ \part -> do
content <- liftM BS.concat EL.consume
return content
let b = ["file" =: Binary file]
r <- eitherWithDB $ insert "tests" b
either (error . show) (const $ return () ) r
答案 0 :(得分:4)
使用Snap.Util.FileUploads。在不让自己对安全漏洞开放的情况下正确上传文件非常棘手。 FileUploads模块在设计时考虑了这一点。
文档很好地描述了handleFileUploads
。它“将上传的文件读入临时目录并调用用户处理程序来处理它们。”您为它提供了类型为
[(PartInfo, Either PolicyViolationException FilePath)] -> m a
handleFileUploads
根据您指定的策略将所有传入文件存储在磁盘上。然后它调用您的处理程序并将其传递给处理的文件列表。