Не удается загрузить 1 ГБ файл в Spring Boot 2 - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь загрузить видео файл размером 1 Гб. Но сервер не позволяет загрузить его.

Возвращается ошибка ниже:

15:46:02.164 [http-nio-8085-exec-10] ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/broadcast].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [/broadcast] threw exception [Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Java heap space] with root cause
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3745) ~[?:?]
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:120) ~[?:?]
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:95) ~[?:?]
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:156) ~[?:?]
    at org.springframework.util.StreamUtils.copy(StreamUtils.java:143) ~[spring-core-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.util.FileCopyUtils.copy(FileCopyUtils.java:110) ~[spring-core-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.util.FileCopyUtils.copyToByteArray(FileCopyUtils.java:162) ~[spring-core-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile.getBytes(StandardMultipartHttpServletRequest.java:245) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]

Я получаю эту ошибку при выполнении кода ниже:

File file = new File(multipartFile.getOriginalFilename());
FileOutputStream fos = new FileOutputStream(file);
fos.write(multipartFile.getBytes());
fos.close();

inJava-файл.

Ниже мой файл "SpringToolSuite4.ini"

-startup
plugins/org.eclipse.equinox.launcher_1.5.400.v20190515-0925.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.1000.v20190125-2016
-product
org.springframework.boot.ide.branding.sts4
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.8
-Xms256m
-Xmx1024m
-XX:+UseG1GC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM

Ответы [ 2 ]

2 голосов
/ 30 сентября 2019

Два вопроса здесь

  1. Ошибка, которую вы видите из-за настроек jvm. Проверьте настройки памяти. (- Xms и -Xmx)

  2. По умолчанию вы не можете загрузить такой большой файл в springboot. Вам необходимо увеличить ограничение по умолчанию (10 МБ)

BeforeSpring Boot 2.0:

spring.http.multipart.max-file-size=-1
spring.http.multipart.max-request-size=-1

После Spring Boot 2.0:

spring.servlet.multipart.max-file-size=-1
spring.servlet.multipart.max-request-size=-1

-1 означает без ограничений. Настоятельно рекомендуется не использовать -1, а вместо этого использовать конкретное значение.

1 голос
/ 30 сентября 2019

Это происходит из-за выделения JVM, когда вы активируете только 1G для своей JVM, когда вы пытаетесь загрузить файл 1G, getBytes() скопирует все данные в вашу память, но памяти на самом деле недостаточно.

Таким образом, подход заключается в следующем: 1) вы можете попытаться выделить больше памяти для вашей JVM, но это действительно не рекомендуется. 2) Вот хороший вопрос / ответ, может быть, лучше выбрать для вашего случая: SpringBoot: загрузка больших потоковых файлов с помощью Apache Commons FileUpload

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...