You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot上传1.5GB大文件时出现Invalid string length错误如何解决?

解决大文件上传时的"Invalid string length"错误

问题根源

你当前的代码通过file.getBytes()把整个文件一次性加载到内存中,1.5GB的超大文件会直接撑爆内存,同时触发"Invalid string length"错误——底层处理时试图将超大字节数组转换为字符串(或类似内存结构),超出了JVM对单字符串的长度限制。

解决方案:流式逐块读写

改用流的方式逐块处理文件,避免一次性加载全部内容到内存,修改后的代码如下:

try {
    Files.createDirectories(filesPath);
} catch (IOException e1) {
    e1.printStackTrace();
    return null;
}

for (MultipartFile file : Arrays.asList(files)) {
    try (InputStream inputStream = file.getInputStream();
         OutputStream outputStream = Files.newOutputStream(Paths.get(filesPath + File.separator + file.getOriginalFilename()))) {
        
        // 8KB缓冲区,可根据服务器性能调整
        byte[] buffer = new byte[8192];
        int bytesRead;
        // 逐块读取并写入文件
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

关键优化点

  • 用getInputStream()替代getBytes():获取文件输入流,按需读取内容,而非一次性加载全量字节到内存
  • try-with-resources语法:自动关闭输入/输出流,避免资源泄漏
  • 固定大小缓冲区:内存占用始终保持在缓冲区大小(8KB),不会随文件体积增长而膨胀

额外注意事项

  • 若使用Spring框架,需在配置文件中放开大文件上传限制:
    spring.servlet.multipart.max-file-size=2GB
    spring.servlet.multipart.max-request-size=2GB
    
  • 提前校验文件大小:在处理前判断文件大小是否超出服务器承载能力,避免无效处理
  • 确保目标磁盘有足够存储空间,避免写入失败

内容的提问来源于stack exchange,提问作者Sizor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:50:24