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

Posted

技术标签:

【中文标题】(Play 2.0) 为 AnyContent 设置最大 POST 大小【英文标题】:(Play 2.0) Set maximum POST size for AnyContent 【发布时间】:2012-07-26 15:48:41 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

TL;DRparsers.text.maxLength = 512k 或任何大小添加到您的application.conf

更新:发现在official documentation

它实际上记录在 API 中,尽管需要一些挖掘才能真正找到它。

扩展 DEFAULT_MAX_TEXT_LENGTH 显示文本数据的最大大小可通过在 application.conf 中设置 parsers.text.maxLength 进行配置。查看源本身,默认值为 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")
    

【讨论】:

为什么是 1024 而不是 1000? 一千字节通常定义为 2^10 或 1024 字节,而不仅仅是 1000 谢谢,这有帮助!此外,Play 2.4 警告:parsers.text.maxLength is deprecated, use play.http.parser.maxMemoryBuffer instead【参考方案2】:

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

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

查看 parse.raw 方法了解更多详情。

【讨论】:

【参考方案3】:

原始正文解析器不会将整个正文缓冲到内存中,它会将正文缓冲到一个点(使用 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 正文解析器如何工作以及如何进行流式正文解析的大部分内容,在此答案中复制该文档毫无意义。

【讨论】:

以上是关于(Play 2.0) 为 AnyContent 设置最大 POST 大小的主要内容,如果未能解决你的问题,请参考以下文章

Play 2.0 与 Play 1.2.5-RC1 + CRUD + 其他模块 [关闭]

如何在 Play 框架 2.0 中创建引导作业

在 Play 中路​​由到静态文件! 2.0

Play 2.0 中的工作支持在哪里?

试图在 Play 中包含 GSON! 2.0项目

Play 2.0 和 SNAPSHOT 依赖项