如何防止Spring分段文件上传存储在内存中并直接流式传输到磁盘?

问题描述 投票:0回答:1

我正在开发一个 Spring Web 应用程序,我需要使用多部分请求处理大文件上传。目前,整个文件存储在内存中,我想将应用程序配置为将文件直接流式传输到磁盘,避免存储在内存中。

在调试过程中,我发现甚至在请求到达处理程序之前就发生了内存使用情况。这表明文件在请求处理的早期阶段已完全加载到内存中。

我尝试使用 HttpServletRequest 直接访问流并手动管理文件上传,但这仍然导致文件完全加载到内存中,而不是在通过网络到达时部分加载。

 @PostMapping(consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])    
 fun insert(request: HttpServletRequest)
spring spring-mvc multipart
1个回答
0
投票

要在 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
            }
        }
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.