OpenJDK本身不处理文件上传,真正执行的是Web框架(如Spring Boot)和业务代码;上传路径由controller中transferTo()或OSS SDK调用决定,与JDK版本无关。

OpenJDK本身不处理文件上传,得靠你的应用代码决定存哪
OpenJDK只是Java运行环境,它不内置HTTP服务、不解析表单、也不管你上传的文件往哪放。真正做这件事的是你写的Web框架(比如Spring Boot)和对应的业务逻辑。部署完OpenJDK后,上传数据的落地方向完全由你的controller里怎么写transferTo()或怎么调用OSS SDK决定,跟JDK版本无关——只要JDK能跑起你的代码就行。
本地磁盘存储:路径权限和目录创建最容易出错
常见错误是file.transferTo(new File("/opt/app/upload/xxx.jpg"))直接抛java.io.FileNotFoundException: /opt/app/upload/xxx.jpg (No such file or directory)。这不是代码写错了,而是:
-
/opt/app/upload/目录根本不存在,transferTo()不会自动创建父目录 - 运行Java进程的用户(比如
appuser)对/opt/app/upload/没有写权限 - Linux SELinux 或 AppArmor 限制了该路径的写入(尤其在CentOS/RHEL上)
正确做法是先确保目录存在且可写:
File uploadDir = new File("/opt/app/upload/");
if (!uploadDir.exists()) {
uploadDir.mkdirs(); // 注意是 mkdirs(),不是 mkdir()
}
// 再检查是否可写
if (!uploadDir.canWrite()) {
throw new IllegalStateException("Upload directory not writable: " + uploadDir);
}
file.transferTo(new File(uploadDir, uuidFileName));
OSS存储:别把AccessKey硬编码进代码
用阿里云OSS时,最常被扫出安全漏洞的就是把accessKeyId和accessKeySecret直接写死在@Value("${oss.access-key}")配置或更糟——写在Java类里。线上一旦泄露,等于把对象存储桶大门敞开。
安全做法是:
- 通过环境变量注入,比如启动时加
-Doss.access-key=$OSS_ACCESS_KEY,再用@Value("${oss.access-key}")读取 - 使用Kubernetes Secret挂载为环境变量或文件,避免明文出现在配置中心
- OSS客户端初始化必须校验
endpoint协议是否为https,否则凭证可能被中间人截获
示例关键校验点:
if (!ossEndpoint.startsWith("https://")) {
throw new IllegalArgumentException("OSS endpoint must use HTTPS");
}
上传后数据不可见?先查临时文件生命周期
Spring默认会把上传文件先写到系统临时目录(如/tmp/tomcat.*/work/...),再由MultipartFile.transferTo()搬走。但如果你忘了调用transferTo(),或者调用失败没捕获异常,这个临时文件会在JVM退出或容器重启后自动清理——导致“上传成功返回了,但文件找不到了”。
排查建议:
- 日志里搜
transferTo是否执行成功,有没有IllegalStateException: File has already been moved - 检查
MultipartFile.isEmpty()是否误判(比如前端传了空文件但size == 0却没报错) - 确认没在
@Controller方法里对同一个MultipartFile反复调用transferTo()(第二次必抛异常)
临时文件路径不受你控制,别试图去new FileInputStream读它——读完就真没了,而且下次请求可能已被删。


















