1

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

服务器:

{-# 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

索引.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--

这不是原始文件的内容。

4

1 回答 1

2
-----------------------------172368540915173703481121109126--

那是一个multipart/form-data领域边界。如果这就是你得到的全部,这意味着表单不包含任何要发布到服务器的数据。我希望您可以通过为其命名来显示您的文件:

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

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

于 2018-08-29T17:36:11.293 回答