我在 Play 2.0 中使用 Scala,每当将大数据(超过 100KB)发布到特定端点时,我都会收到 413 错误。它正在使用 anyContent 解析器,并且为此特定 API 使用任何其他解析器是不合理的。
Stack Overflow 上还有其他问题展示了如何增加文本或 JSON 请求的最大 POST 大小。我如何为任何内容执行此操作,或者只是增加项目范围内的限制?
我在 Play 2.0 中使用 Scala,每当将大数据(超过 100KB)发布到特定端点时,我都会收到 413 错误。它正在使用 anyContent 解析器,并且为此特定 API 使用任何其他解析器是不合理的。
Stack Overflow 上还有其他问题展示了如何增加文本或 JSON 请求的最大 POST 大小。我如何为任何内容执行此操作,或者只是增加项目范围内的限制?
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")
}
}
请注意那些使用原始解析器的人,将最大值作为参数:
动作(解析.raw(10000 * 1024))
有关详细信息,请参阅 parse.raw 方法。
原始正文解析器不会将整个正文缓冲到内存中,它会将正文缓冲到一个点(使用 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 正文解析器如何工作以及如何进行流式正文解析的大多数事情,在此答案中复制该文档没有意义。