我正在开发一个 Spring Web 应用程序,我需要使用多部分请求处理大文件上传。目前,整个文件存储在内存中,我想将应用程序配置为将文件直接流式传输到磁盘,避免存储在内存中。
在调试过程中,我发现甚至在请求到达处理程序之前就发生了内存使用情况。这表明文件在请求处理的早期阶段已完全加载到内存中。
我尝试使用 HttpServletRequest 直接访问流并手动管理文件上传,但这仍然导致文件完全加载到内存中,而不是在通过网络到达时部分加载。
@PostMapping(consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
fun insert(request: HttpServletRequest)
要在 Spring Web 应用程序中处理大文件上传而不将整个文件加载到内存中,您可以使用 Spring 的
MultipartFile
和 DataBufferUtils
将文件直接流式传输到磁盘
创建文件上传控制器:使用
MultipartFile
处理文件上传请求,然后将文件流式传输到磁盘:使用 DataBufferUtils
直接读取文件内容并将其写入磁盘
这是一个示例(供参考):
import org.springframework.web.bind.annotation.*
import org.springframework.web.multipart.MultipartFile
import java.io.File
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
@RestController
@RequestMapping("/upload")
class FileUploadController {
@PostMapping(consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
fun uploadFile(@RequestParam("file") file: MultipartFile) {
val directory = Paths.get("path/to/directory")
val path = directory.resolve(file.getOriginalFilename())
// Create the file if it doesn't exist
if (!Files.exists(path)) {
Files.createFile(path)
}
// Stream the file to disk
DataBufferUtils.write(file.inputStream, path).subscribe { result ->
if (result.hasError()) {
throw result.error
}
}
}
}