Spring Boot Multipart上传部署AWS EC2报No space left on device错误
Failed to parse multipart servlet request; nested exception is org.apache.tomcat.util.http.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. No space left on device
错误根因分析
该报错本质是Spring Boot内置Tomcat处理multipart/form-data请求时,需要先将上传的文件写入本地临时目录缓存,写入时触发了系统级的空间不足错误,仅核查磁盘分区容量使用率无法覆盖以下几个常见触发场景:
- inode资源耗尽:系统存储小文件过多时,会耗尽磁盘的inode索引资源,即使磁盘剩余容量充足,也无法创建新文件,触发空间不足报错。
- 临时目录为tmpfs内存挂载:部分AWS EC2默认AMI会将
/tmp目录挂载为tmpfs类型的内存虚拟磁盘,容量上限通常为实例内存的50%,如果上传的文件大小超过tmpfs剩余容量,就会触发报错,该分区的容量占用不会被常规磁盘使用率统计覆盖。 - Spring Boot临时文件配置问题:默认的multipart临时存储路径权限不足,或者历史临时文件未被服务自动清理,占满了对应路径的容量。
修复方案
- 首先执行
df -i核查inode使用率,如果对应分区使用率为100%,清理/tmp目录下的陈旧临时文件、删除系统中无用的零散小文件即可恢复。 - 执行
df -h /tmp确认临时目录挂载类型,如果为tmpfs,可直接修改Spring Boot配置,自定义multipart临时存储路径到磁盘分区的可读写目录,在application配置中添加:
配置完成后给对应目录分配应用运行账号的读写权限即可。spring.servlet.multipart.location=/opt/your-app/temp - 优化S3上传逻辑:无需将上传文件缓存到本地,直接读取MultipartFile的输入流传给AWS S3 SDK的上传接口,彻底规避本地临时文件存储的依赖,示例代码逻辑:
public void uploadFileToS3(String bucket, String key, MultipartFile file) throws IOException { s3Client.putObject(PutObjectRequest.builder() .bucket(bucket) .key(key) .build(), RequestBody.fromInputStream(file.getInputStream(), file.getSize())); } - 可根据业务上传文件大小调整阈值配置,设置小于阈值的文件直接缓存在内存中,减少磁盘写入:
# 单位为MB,示例设置小于10MB的文件直接走内存缓存 spring.servlet.multipart.file-size-threshold=10MB
内容的提问来源于stack exchange,提问作者Rajesh Iyer
相关产品推荐
相关产品推荐

