Spring Boot部署Heroku后无法访问上传资源,返回404错误
问题根因
1. Heroku临时文件系统限制
这是最核心的问题:Heroku的dyno实例使用的是临时文件系统,仅在dyno运行周期内有效,所有写入本地磁盘的文件(包括你上传的product-photos目录下的图片),会在dyno重启、应用重新部署、甚至dyno自动休眠唤醒后被全部清空。如果你的应用开了多个dyno实例,上传到A实例的图片,B实例也完全无法访问。
2. 跨平台路径协议适配问题
本地Windows环境下file://加绝对路径的写法可以正常运行,但Heroku使用的是Linux操作系统,Linux下本地文件的协议前缀需要是file:///(三个斜杠),你当前的拼接逻辑少了一个斜杠,导致资源路径解析错误。
修复方案
临时修复路径适配问题(仅解决路径解析错误,无法解决文件丢失问题)
修改MvcConfig类里的资源处理器注册逻辑,不要硬编码协议前缀,直接使用file:拼接路径,Spring会自动适配不同操作系统的协议格式:
registry.addResourceHandler("/" + dirName + "/**").addResourceLocations("file:" + uploadPath + "/");
修改后你可以在上传逻辑和资源注册逻辑里新增路径日志打印,验证Heroku环境下的路径是否符合预期。
长期可用的生产级修复方案
Heroku官方明确不推荐将用户上传的文件存储在本地文件系统,你需要替换为第三方对象存储服务,上传时直接将图片传到对象存储中,页面展示时直接使用对象存储的公网访问地址,完全规避本地存储的所有问题。
内容的提问来源于stack exchange,提问作者Shubhanshu Saxena
相关产品推荐
相关产品推荐

