Spring会将内容保存在内存中还是存储在磁盘中?

时间:2009-12-23 12:50:11

标签: java spring-mvc apache-commons-fileupload

当一个文件说从浏览器上传100 MB大小时,Spring将整个数据保存在内存中或临时存储在磁盘中。通过Spring doc之后我知道如何设置临时目录,但我想知道如果我不提及会发生什么。

我有以下声明:

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

Bean:

public class FileHolder {

    private MultipartFile file;

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

    public MultipartFile getFile() {
        return file;
    }
}

上面bean中的“file”对象是否会保存100 MB数据?

4 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

在多部分用户bean定义中,例如:

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

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

答案 3 :(得分:0)

在春季启动中,spring.servlet.multipart.file-size-threshold指定将文件写入磁盘之后的大小阈值。

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

链接:spring boot properties

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