您无需定义Mem
. 鉴于目前编写servant-multipart 的方式,默认情况下您不必指定任何multipart 选项。但是,您可以指定它们,使用包含您的选项serveWithContext
的合适选项。Context
下面是一个完整的示例,它只是将最大文件名长度覆盖为 512。特别感兴趣的是ctxt
,它包含multipartOpts
我们的自定义选项。
{-# LANGUAGE DataKinds, TypeOperators #-}
import Data.Proxy
import Network.Wai.Handler.Warp
import Network.Wai.Parse
import Servant
import Servant.Multipart
type API = MultipartForm Tmp (MultipartData Tmp) :> Post '[PlainText] String
api :: Proxy API
api = Proxy
server :: MultipartData Tmp -> Handler String
server multipartData = return str
where str = "The form was submitted with "
++ show nInputs ++ " textual inputs and "
++ show nFiles ++ " files."
nInputs = length (inputs multipartData)
nFiles = length (files multipartData)
main :: IO ()
main = run 8080 (serveWithContext api ctxt server)
where ctxt = multipartOpts :. EmptyContext
multipartOpts = (defaultMultipartOptions (Proxy :: Proxy Tmp))
{ generalOptions = setMaxRequestKeyLength 512 defaultParseRequestBodyOptions
}
编辑:如果您是 Nix 用户,您可以使用此代码将以下内容放在 haskell 文件的顶部,使其可执行,然后启动它,让 Nix 获取所有的 deps 等。
#!/usr/bin/env nix-shell
#!nix-shell -i runhaskell -p "haskellPackages.ghcWithPackages (pkgs: with pkgs; [servant-server servant-multipart wai-extra warp ])"