(Play 2.0)为AnyContent设置最大POST大小

时间:2012-07-27 23:04:55

标签: scala playframework-2.0

我在Play 2.0中使用Scala,每当将大数据(超过100KB)发布到特定端点时,我都会收到413错误。它使用anyContent解析器,对这个特定的API使用任何其他解析器是不合理的。

Stack Overflow还有其他一些问题,展示如何增加文本或JSON请求的最大POST大小。我如何为anyContent执行此操作,或者仅在项目范围内增加限制?

3 个答案:

答案 0 :(得分:20)

TL; DR 添加parsers.text.maxLength = 512k或其他任何尺寸application.conf

更新:在official documentation

中找到

它实际上记录在API中,虽然实际上找到它需要一些挖掘。

展开DEFAULT_MAX_TEXT_LENGTH表示可以通过在parsers.text.maxLength中设置application.conf来配置文本数据的最大尺寸。查看源本身,默认值为100Kb,因此这很可能是您需要设置的内容。

在一个有点相关的说明中,我们还有maxLength方法可用于任何BodyParser,这意味着对于非文本数据,除非您应用该方法,否则没有上限。实际上,我们可以将它应用于AnyContent解析器,如下所示:

def foo = Action(parse.maxLength(512 * 1024, parser = parse.anyContent)) { implicit req =>
    req.body match {
        case Left(_) => EntityTooLarge
        case Right(body) => Ok("This is totally not too large")
    }
}

答案 1 :(得分:0)

对于那些使用原始解析器的人,请将最大值作为参数:

动作(parse.raw(10000 * 1024))

有关更多详细信息,请参阅parse.raw方法。

答案 2 :(得分:0)

原始主体解析器不会将整个主体缓存到内存中,而是将主体缓存到一个点(使用play.http.parser.maxMemoryBuffer配置,默认为100kb),一旦超过该值,它将刷新主体到文件并开始将其写入文件,但是它对写入文件的数据量也有限制,该限制是使用play.http.parser.maxDiskBuffer配置的,默认值为10mb。您的15mb身体可能已超过该限制,因此您需要相应地增加play.http.parser.maxDiskBuffer。所有这些都在文档中进行了解释。

要回答有关如何流式处理请求的实际问题,可以在这里用Java编写自定义主体解析器的文档:

https://www.playframework.com/documentation/2.6.x/JavaBodyParsers#Writing-a-custom-body-parser

这说明了您需要了解的有关Play正文解析器如何工作以及因此如何进行流式正文解析的大多数事情,而无需在此答案中复制该文档。