如何在帖子正文中将文件内容上传到网站

时间:2018-08-29 14:26:11

标签: html haskell post scotty

如何从浏览器将文件上传到Web服务器?该服务器使用Scotty用Haskell编写。这是我尝试过的:

服务器:

{-# LANGUAGE OverloadedStrings #-}
module Main where
import qualified Data.ByteString.Lazy as BL
import qualified Web.Scotty as Scot
import qualified Control.Monad.IO.Class as Cm
import qualified Data.Digest.Pure.SHA as Dps

dir :: String
dir = "/home/t/fileUpload/"

main :: IO ()
main =
    Scot.scotty 3000 $ do
        Scot.get "/" $ Scot.file $ dir ++ "index.html"
        Scot.post "/upload" $ do
            contents <- Scot.body
            let fileName = Dps.showDigest $ Dps.sha256 contents
            Cm.liftIO $ BL.writeFile (dir ++ fileName) contents

index.html:

<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
</head>
<body>
<form enctype="multipart/form-data" action="/upload" method="post">
<input type="file"> <input type="submit" value="Submit"></form>
</body>
</html>

当我在浏览器中访问http://localhost:3000时,我单击“浏览”按钮,选择一个文件,然后单击“提交”。然后将我带到一个名为http://localhost:3000/upload的空白页面,并且文件被保存到“ / home / t / fileUpload / somelonghash”。很好,但是问题在于保存的文件仅包含以下内容:

-----------------------------172368540915173703481121109126--

这不是原始文件的内容。

1 个答案:

答案 0 :(得分:2)

-----------------------------172368540915173703481121109126--

这是multipart/form-data字段的边界。如果这一切都完成了,则意味着该表单不包含任何要发布到服务器的数据。我希望您可以通过为其命名来显示文件:

<input type="file" name="myfile">

即使执行此操作,您仍然会在响应正文中获得边界和标头以及实际文件内容。您需要做的是解析multipart/form-data并从那里提取文件内容。我认为,如果您使用files函数而不是使用body,Scotty会为您完成此操作。