Phoenix LiveView部署Heroku后上传头像无法显示问题排查
Phoenix LiveView Heroku上传头像404问题解决
核心问题
- Heroku文件系统特性限制:Heroku的dyno使用临时文件系统,所有上传到本地的文件会在dyno重启(部署、缩放、自动重启)后彻底丢失,这是根本硬伤。
- 静态文件处理逻辑不匹配:生产环境中,Phoenix的
Plug.Static读取的是编译打包完成的静态资源(路径为_build/prod/lib/my_app/priv/static),而你上传的文件直接写入了运行时的priv/static/uploads目录,这个目录不在生产环境Plug.Static的默认查找范围内,所以请求会返回404。
解决方法
1. 改用云存储(生产环境必选方案)
放弃本地存储,使用S3、Cloudinary等云存储服务,这是Heroku上处理用户上传文件的标准做法:
- 修改LiveView的上传逻辑,将文件直接上传到云存储服务,不再写入本地
uploads目录。 - 页面渲染头像时,直接使用云存储提供的公开文件URL。
2. 临时调整本地存储(仅用于测试,禁止生产环境使用)
如果只是临时测试功能,可以修改Plug.Static配置,让它能读取运行时新增的priv/static/uploads文件:
# 保留原有静态资源配置 plug Plug.Static, at: "/", from: :my_app, gzip: false, only: MyAppWeb.static_paths() # 新增单独处理uploads目录的配置 plug Plug.Static, at: "/uploads", from: "priv/static/uploads", gzip: false
⚠️ 注意:这种方法仅能临时验证功能,Heroku dyno重启后所有上传文件会全部丢失,绝对不能用于生产环境。
3. 验证文件上传路径
先确认文件确实被上传到了正确位置:
- 通过
heroku run bash命令进入dyno终端,执行ls priv/static/uploads查看目录下是否存在上传的文件,确保上传逻辑的路径没有写错。
内容的提问来源于stack exchange,提问作者Linda Kadz
相关产品推荐
相关产品推荐

