如何从浏览器将文件上传到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--
这不是原始文件的内容。
答案 0 :(得分:2)
-----------------------------172368540915173703481121109126--
这是multipart/form-data
字段的边界。如果这一切都完成了,则意味着该表单不包含任何要发布到服务器的数据。我希望您可以通过为其命名来显示文件:
<input type="file" name="myfile">
即使执行此操作,您仍然会在响应正文中获得边界和标头以及实际文件内容。您需要做的是解析multipart/form-data
并从那里提取文件内容。我认为,如果您使用files
函数而不是使用body
,Scotty会为您完成此操作。