Laravel接收Vue上传的图片一段时间后服务器无法加载显示如何解决
故障根因
- Heroku平台的dyno实例使用临时文件系统,仅在dyno运行周期内保留运行时写入的文件,当dyno触发休眠、重启、部署或者平台自动回收(平台默认每24小时内至少会回收重启一次dyno,你遇到的1-2小时失效大概率是触发了闲置dyno自动休眠重启)时,所有写入本地磁盘的文件都会被重置清空,你上传到
public/image_cards目录的文件也会被删除,因此会出现上传后短时间可访问,一段时间后无法加载的问题。该问题和你提供的上传业务代码无关,其他虚拟主机因为具备持久化本地磁盘存储,所以不会出现该问题。
可行解决方案
- 优先选择第三方对象存储服务:比如阿里云OSS、腾讯云COS、AWS S3等,Laravel框架原生支持上述存储服务的驱动适配,修改上传逻辑将图片直接上传到对象存储服务中,数据库内存储对象存储的公共访问链接即可,从根本上解决Heroku无持久化本地存储的问题。
- 若不想引入额外服务,可选用Heroku官方提供的持久化存储附加组件,不过该类组件普遍成本较高,性价比远低于使用对象存储服务。
- 可通过手动执行
heroku restart命令重启dyno,立刻复现图片失效的问题,验证上述根因判断。
现有代码优化建议
你提供的上传代码本身不影响本次故障,但存在可优化点:
- 直接使用
getClientOriginalName()作为存储文件名,若出现不同用户上传同名文件的情况,会导致旧文件被覆盖,建议改为生成唯一文件名,示例代码如下:
if ($request->hasFile('image')) { $file = $request->file('image'); // 生成唯一文件名避免重名 $filename = uniqid('img_', true) . '.' . $file->getClientOriginalExtension(); $path = $request->file('image')->move(public_path('image_cards'), $filename); $card->image = $filename; }
内容的提问来源于stack exchange,提问作者Ossama Abd
相关产品推荐
相关产品推荐

