2016-03-29 7 views
7

Я использую PlayFramework 2.4.6, пытаясь загрузить многослойный файл (размер 18m) и сервер возвращает следующее сообщение об ошибке:PlayFramework 2.4.6 ошибка 413 Request Entity Too Large

For request 'POST /api/myEndpoint' [Request Entity Too Large] 

Я смотрел вокруг и попытался следующие с из успеха:

  1. play.http.parser.maxMemoryBuffer = 2000000K
  2. parsers.MultipartFormData.maxLength = 1024000K
  3. play.http.parser.maxDiskBuffer = 2000000K
  4. Action.async (parse.anyContent (Некоторые из них (1024 * 200L)))

И ни один из них не решает эту проблему.

Здесь StackTrace, а также:

14:57:33.128 [New I/O worker #2] [error] -  p.c.server.netty.RequestBodyHandler - Exception caught in RequestBodyHandler 
java.nio.channels.ClosedChannelException: null 
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.setInterestOps(AbstractNioWorker.java:506) [netty-3.10.4.Final.jar:na] 
at org.jboss.netty.channel.socket.nio.AbstractNioWorker$1.run(AbstractNioWorker.java:455) [netty-3.10.4.Final.jar:na] 
at org.jboss.netty.channel.socket.ChannelRunnableWrapper.run(ChannelRunnableWrapper.java:40) [netty-3.10.4.Final.jar:na] 
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:391) [netty-3.10.4.Final.jar:na] 
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:315) [netty-3.10.4.Final.jar:na] 
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) [netty-3.10.4.Final.jar:na] 
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) [netty-3.10.4.Final.jar:na] 
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) [netty-3.10.4.Final.jar:na] 
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) [netty-3.10.4.Final.jar:na] 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_65] 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_65] 
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_65] 

ответ

16

решена проблема с этим:

play.http.parser.maxDiskBuffer = 100MB 

parsers.anyContent.maxLength = 100MB 
+0

Спасибо, это помогло мне :) – Seeker

+0

@gleeb, не могли бы вы pl Легко объяснить, где поставить эти параметры в application.conf ifle? Я помещаю эти параметры в конец application.conf, но это не работает. – Tom

+0

application.conf – Gleeb

7

У меня была та же проблема, посылая большую форму и play.http.parser.maxMemoryBuffer=4MB решить ее.

+1

Спасибо! Это решило ошибку для меня. – Blackbird

4

Смотрите документацию о буферов памяти и диска Play использует: https://www.playframework.com/documentation/2.4.x/ScalaBodyParsers#Max-content-length

Text based body parsers (such as text, json, xml or formUrlEncoded) use a max content length because they have to load all the content into memory. By default, the maximum content length that they will parse is 100KB. It can be overridden by specifying the play.http.parser.maxMemoryBuffer property in application.conf:

play.http.parser.maxMemoryBuffer=128K

For parsers that buffer content on disk, such as the raw parser or multipart/form-data, the maximum content length is specified using the play.http.parser.maxDiskBuffer property, it defaults to 10MB. The multipart/form-data parser also enforces the text max length property for the aggregate of the data fields.

Таким образом, поскольку вы пытаетесь загрузить из нескольких частей файла, вам необходимо увеличить play.http.parser.maxDiskBuffer к чему-то> 18MB ,

Таким образом, добавив в ваш application.conf должен исправить:

play.http.parser.maxDiskBuffer=100MB 
0

Для тех, кто сталкивается проблема с Play Framework 2.6.x см документации на https://www.playframework.com/documentation/2.6.x/ScalaBodyParsers

Max content length Text based body parsers (such as text, json, xml or formUrlEncoded) use a max content length because they have to load all the content into memory. By default, the maximum content length that they will parse is 100KB. It can be overridden by specifying the play.http.parser.maxMemoryBuffer property in application.conf:

оных следующее application.conf:

play.http.parser.maxMemoryBuffer = 5MB 
+0

Этот ответ, похоже, повторяет то же самое решение, что и предыдущие. Если вы чувствуете, что у вас есть что добавить, оставьте его в качестве комментария к исходному ответу. Альтернативно, если у вас есть другое решение, объясните, почему он отличается (и, возможно, лучше). – MTCoster