当一个文件说从浏览器上传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数据?
答案 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
进行配置)。
请注意此处实现的一些错误:https://github.com/spring-projects/spring-boot/issues/9073