我在Play 2.0中使用Scala,每当将大数据(超过100KB)发布到特定端点时,我都会收到413错误。它使用anyContent解析器,对这个特定的API使用任何其他解析器是不合理的。
Stack Overflow还有其他一些问题,展示如何增加文本或JSON请求的最大POST大小。我如何为anyContent执行此操作,或者仅在项目范围内增加限制?
答案 0 :(得分:20)
TL; DR 添加parsers.text.maxLength = 512k
或其他任何尺寸application.conf
它实际上记录在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正文解析器如何工作以及因此如何进行流式正文解析的大多数事情,而无需在此答案中复制该文档。