15

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

Stack Overflow 上还有其他问题展示了如何增加文本或 JSON 请求的最大 POST 大小。我如何为任何内容执行此操作,或者只是增加项目范围内的限制?

4

3 回答 3

22

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")
    }
}
于 2012-07-29T11:00:13.353 回答
0

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

动作(解析.raw(10000 * 1024))

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

于 2017-12-21T17:10:46.827 回答
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 正文解析器如何工作以及如何进行流式正文解析的大多数事情,在此答案中复制该文档没有意义。

于 2019-12-15T09:49:32.787 回答