【问题标题】:Will Spring hold contents in memory or stores in the disk?Spring会将内容保存在内存中还是存储在磁盘中?
【发布时间】:2010-12-29 11:40:36
【问题描述】:

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

我有以下声明:

<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 数据吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

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

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

          链接:spring boot properties

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

          【讨论】:

            猜你喜欢
            • 2012-05-13
            • 1970-01-01
            • 2012-05-13
            • 2014-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多