12

当从浏览器上传一个 100 MB 大小的文件时,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;
    }
}

上面 bean 中的“文件”对象会保存 100 MB 的数据吗?

4

4 回答 4

14

在javadoc中的更多挖掘表明,默认的最大内存大小为 10240 字节。从那我假设任何小于 10kB 的上传都保存在内存中,任何更大的都将存储在磁盘上。如果您不指定磁盘位置,它可能会使用默认值(我猜它会使用系统默认的 tmp 目录)。

于 2009-12-23T12:56:21.423 回答
3

在 Spring Boot 中,spring.servlet.multipart.file-size-threshold 指定将文件写入磁盘的大小阈值。

该属性的默认值为零。这意味着默认情况下,它将所有文件存储在一个临时位置(可以通过 配置spring.servlet.multipart.location)。

链接:spring boot 属性

请注意此处实现的一些错误:https ://github.com/spring-projects/spring-boot/issues/9073

于 2018-12-24T13:39:44.637 回答
2

如果不设置临时目录,CommonsMultipartResolver会将临时文件保存到 servlet 容器的临时目录中。

您示例中的“文件”对象不包含类似于 java.io.File 引用的数据。您需要使用file.getBytes().

于 2009-12-23T16:29:43.060 回答
2

是的,但如果它存储在磁盘上,它将在处理请求后被删除。您可以设置何时将其存储在磁盘上的阈值:

在您的 multipartresolver bean 定义中,例如:

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

如果它保存在内存中,您可以将其存储在会话中并在下一个请求中处理它,例如,如果您正在等待用户确认。

于 2009-12-23T16:43:10.443 回答