(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;DR 将parsers.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 大小的主要内容,如果未能解决你的问题,请参考以下文章