如何在scotty中限制文件上传的大小?

tau*_*uli 1 haskell scotty

我目前正在研究Scotty的web开发,到目前为止看起来还不错.我很担心,似乎没有办法丢弃文件上传(或更好的任意POST主体),文件大小超过一定限度而不先接收整个文件.https://github.com/scotty-web/scotty/blob/master/examples/upload.hs上的示例未提及文件大小限制,我在文档中找不到任何内容.

我当然可以length在ByteString上做一个,但我看不出它会如何工作,直到整个文件已经加载到内存中.

Ben*_*ach 6

您应该能够设置一些maxBytes参数,maxBytes懒洋洋地从每个文件内容中取出,将文件上传分区为失败和成功,然后处理它们中的每一个.这里有一些未经测试的代码来说明我在您的应用程序上下文中的含义:

post "/upload" $ do
 fs <- files
 let maxBytes = 9000 -- etc
     fs' = [ (fieldName, BS.unpack (fileName fi), B.take (maxBytes + 1) (fileContent fi)) | (fieldName,fi) <- fs ]
     (oks, fails) = partition ((<= maxBytes) . B.length) fs' -- separate out failures
 liftIO $ sequence_ [ B.writeFile ("uploads" </> fn) fc | (_,fn,fc) <- oks ]
 -- do something with 'fails'
 -- and continue...
Run Code Online (Sandbox Code Playgroud)

完全有可能只是"即时"过滤掉故障,但该解决方案更适合您想要对故障做什么 - 这应该说明这个想法.这个解决方案应该照顾你的顾虑; 因为你正在使用懒人ByteString,所以B.take不应该读取任何要标记为失败上传的文件的全部内容.

  • 我读了一点“ scotty”库,似乎“ files”是由“ parseRequestBody”生成的,该文件最初称为“ Parse.sinkRequestBody”或“ Parse.sinkRequestBodyEx”。“ scotty”中的“ parseRequestBody”和“ wai-extra”中的“ sinkRequestBodyEx”在内部都使用“ Data.ByteString”,这是严格的。我的猜测是在`files'惰性字节字符串不惰性之前进行请求处理,因此在`files'之后执行惰性动作没有用。 (2认同)