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
相关产品推荐
相关产品推荐

