2016-03-29 18 views
7

Używam PlayFramework 2.4.6, próbuje załadować plik wieloczęściowy (rozmiar 18m) i serwer zwraca następujący błąd:PlayFramework 2.4.6 Błąd 413 Zbyt duże żądanie

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

Mam rozejrzał i próbowałem następujące z odchodzący sukces:

  1. play.http.parser.maxMemoryBuffer = 2000000K
  2. parsers.MultipartFormData.maxLength = 1024000K
  3. play.http.parser.maxDiskBuffer = 2000000K
  4. Action.async (parse.anyContent (Niektórzy (1024 * 200L)))

I żaden z nich nie rozwiązuje problemu.

Oto StackTrace jak:

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] 

Odpowiedz

16

rozwiązać problem z tym:

play.http.parser.maxDiskBuffer = 100MB 

parsers.anyContent.maxLength = 100MB 
+0

Dzięki temu pomógł mi :) – Seeker

+0

@gleeb, czy mógłbyś wyjaśnić, gdzie umieścić te opcje w pliku application.conf ifle? Umieściłem te opcje na końcu pliku application.conf, ale to nie działa. – Tom

+0

application.conf – Gleeb

7

I był ten sam problem wysyłania dużej formy, a play.http.parser.maxMemoryBuffer=4MB rozwiązany.

+1

Dzięki! To rozwiązało dla mnie błąd. – Blackbird

4

Zobacz tę dokumentację o bufory pamięci i dysków Zagraj zastosowań: 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.

Tak, ponieważ starasz się przesyłając wieloczęściowy plik, musisz zwiększyć play.http.parser.maxDiskBuffer coś> 18MB .

Tak, dodając to do application.conf powinien to naprawić:

play.http.parser.maxDiskBuffer=100MB 
0

dla tych, którzy stoją w obliczu problemu z 2.6.x play ramowych patrz dokumentacja na 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:

Dodaj następujący w application.conf:

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

Ta odpowiedź wydaje się powtarzać to samo rozwiązanie, co poprzednie. Jeśli uważasz, że masz coś do dodania, zostaw to jako komentarz do oryginalnej odpowiedzi. Ewentualnie, jeśli masz inne rozwiązanie, wyjaśnij, dlaczego jest inny (i prawdopodobnie lepszy). – MTCoster

Powiązane problemy