Spring的MutipartFile 会直接将流转成文件存放在临时目录嘛?
Spring 的 MultipartFile
默认会将上传的文件存储到临时目录。具体行为取决于底层的 MultipartResolver
实现。常见的实现包括:
1. StandardServletMultipartResolver
(默认实现)
如果使用的是 StandardServletMultipartResolver
(基于 Servlet 3.0+ 的 javax.servlet.MultipartConfigElement
),那么:
MultipartFile
默认会存储在 系统的临时目录(通常是java.io.tmpdir
指定的目录)。- 处理完成后,临时文件可能会被清理,但这取决于垃圾回收和服务器的管理策略。
临时目录通常是:
- Windows:
C:\Users\{username}\AppData\Local\Temp
- Linux/Mac:
/tmp
示例
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) throws IOException {
// 获取上传的文件存放的临时路径
File tempFile = File.createTempFile("upload_", file.getOriginalFilename());
file.transferTo(tempFile);
return "Uploaded to: " + tempFile.getAbsolutePath();
}
2. CommonsMultipartResolver
(基于 Apache Commons FileUpload)
如果项目中配置了 CommonsMultipartResolver
(基于 commons-fileupload
),其默认行为是:
- 上传的文件 大小小于
fileSizeThreshold
(默认 10KB)时,存储在内存中。 - 大于
fileSizeThreshold
的文件,会写入到临时目录(java.io.tmpdir
)。
示例
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5242880"/> <!-- 5MB -->
<property name="maxInMemorySize" value="1048576"/> <!-- 1MB -->
</bean>
如何避免临时存储?
如果不希望文件被存储到临时目录,可以:
- 直接处理流(避免调用
transferTo()
):InputStream inputStream = file.getInputStream(); // 处理流数据,不存储到文件系统
- 调整
fileSizeThreshold
让小文件仅存储在内存中(CommonsMultipartResolver
)。 - 自定义存储路径 在
MultipartConfigElement
中设置location
。
总结
MultipartFile
默认会存放到临时目录,特别是大文件。StandardServletMultipartResolver
依赖Servlet 3.0
,文件默认存放到java.io.tmpdir
目录。CommonsMultipartResolver
则会根据fileSizeThreshold
选择存储方式。- 可以使用
file.getInputStream()
直接处理流,避免临时存储。