抓取二进制文件上传

时间:2013-07-21 17:13:20

标签: haskell-snap-framework

我需要了解使用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

1 个答案:

答案 0 :(得分:4)

使用Snap.Util.FileUploads。在不让自己对安全漏洞开放的情况下正确上传文件非常棘手。 FileUploads模块在设计时考虑了这一点。

文档很好地描述了handleFileUploads。它“将上传的文件读入临时目录并调用用户处理程序来处理它们。”您为它提供了类型为

的处理程序
[(PartInfo, Either PolicyViolationException FilePath)] -> m a

handleFileUploads根据您指定的策略将所有传入文件存储在磁盘上。然后它调用您的处理程序并将其传递给处理的文件列表。