Будет ли Spring хранить содержимое в памяти или на диске? - PullRequest
11 голосов
/ 23 декабря 2009

Когда файл, скажем, размером 100 МБ загружен из браузера, Spring сохранит все данные в памяти или временно сохранит на диске. После просмотра Spring doc я знаю, как установить временный каталог, но я хочу знать, что произойдет, если я не упомяну это.

Имею следующую декларацию:

<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

Боб:

public class FileHolder {

    private MultipartFile file;

    public void setFile(MultipartFile file) {
        this.file = file;
    }

    public MultipartFile getFile() {
        return file;
    }
}

Будет ли объект "файл" в указанном выше компоненте содержать эти 100 МБ данных?

Ответы [ 4 ]

12 голосов
/ 23 декабря 2009

Немного больше копания в javadoc показывает, что максимальный размер в памяти по умолчанию составляет 10240 байт. Исходя из этого, я предполагаю, что любая загрузка менее 10 КБ хранится в памяти, все большее будет храниться на диске. Если вы не укажете расположение диска, он, скорее всего, будет использовать файл по умолчанию (я думаю, он будет использовать системный каталог tmp по умолчанию).

2 голосов
/ 23 декабря 2009

Да, но если он хранится на диске, он будет удален после обработки запроса. Вы можете установить порог, когда он будет храниться на диске:

В вашем определении bean-компонента multipartresolver, например ::

<property name="maxUploadSize" value="1000000" /> 
<property name="maxInMemorySize" value="1000" /> 

Если он хранится в памяти, его можно сохранить в сеансе и обработать в следующем запросе, например, например, если вы ожидаете подтверждения пользователя.

2 голосов
/ 23 декабря 2009

Если вы не установите временный каталог CommonsMultipartResolver сохранит временные файлы во временный каталог контейнера сервлета.

Объект "file" в вашем примере не содержит данных, которые он похож на ссылку java.io.File. Вам нужно получить данные с file.getBytes().

1 голос
/ 24 декабря 2018

При весенней загрузке spring.servlet.multipart.file-size-threshold указывает порог размера, после которого файлы будут записываться на диск.

Значение свойства по умолчанию равно нулю. Это означает, что по умолчанию все файлы хранятся во временном местоположении (может быть настроено с помощью spring.servlet.multipart.location).

Ссылка: свойства пружинного чехла

Обратите внимание на некоторые ошибки в реализациях здесь: https://github.com/spring-projects/spring-boot/issues/9073

...