Как загрузить файл на сайт с содержимым файла в теле сообщения - PullRequest
0 голосов
/ 29 августа 2018

Как загрузить файл на мой веб-сервер из браузера? Сервер написан на Хаскеле, используя Скотти. Вот что я попробовал:

Сервер:

{-# 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 голосов
/ 29 августа 2018
-----------------------------172368540915173703481121109126--

Это граница поля multipart/form-data. Если это все, что вы получаете, это означает, что форма не содержала никаких данных для отправки на сервер. Я полагаю, что вы можете получить доступ к своему файлу, дав ему имя:

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

Даже если вы сделаете это, вы все равно получите границы и заголовки в теле ответа вместе с фактическим содержимым файла. Вам нужно разобрать multipart/form-data и извлечь из него содержимое файла. Я думаю, что Скотти сделает это за вас, если вы используете функцию files, а не body.

...