如何配置仆人多部分以允许更长的文件名?



我有一些servant-multipart端点,它用类似MultipartForm Mem (MultipartData Mem).但是,由于defaultParseRequestBodyOptions,此端点不允许我上传长名称文件。

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

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

您不需要定义Mem的替代方案。鉴于当前编写服务方多部分的方式,默认情况下不必指定任何多部分选项。但是,您可以使用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 ])"

最新更新