2

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

1 回答 1

4

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

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

[(PartInfo, Either PolicyViolationException FilePath)] -> m a

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

于 2013-07-22T16:32:05.133 回答