1

我有一些servant-multipart端点,它是用类似的东西定义的MultipartForm Mem (MultipartData Mem)。但是,此端点不允许我上传长名称文件,因为defaultParseRequestBodyOptions.

不知何故,我想Mem用一些Mem'与 相关的替换noLimitParseRequestBodyOptions,但我无法弄清楚如何做到这一点。如何使用具有此选项的servant-multipart端点Network.Wai.Parse

表单中的Multipart类型由 参数化,在模块tag中有两个实现的值,和。现在,是一个具有关联类型的实例。我猜我必须在这里修改一些东西来调整相关的.Servant.MultipartTmpMemMemMultipartBackendMultipartBackendOptionsParseRequestBodyOptions

4

1 回答 1

3

您无需定义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 ])"
于 2018-07-16T16:27:32.700 回答