如何防止OctoberCMS生成重复文件?响应式图片partial异常处理
问题原因
你的代码中存在不必要的October\Rain\Database\Attach\File模型初始化操作:
// 原问题代码段 $file = new \October\Rain\Database\Attach\File; $file->fromFile($this['local_path']); $this['width'] = $file->getWidthAttribute();
fromFile方法的设计用途是将文件持久化存入系统附件库,每次调用都会生成一份独立的全尺寸文件副本存到storage/app/uploads/public目录,你只是需要获取图片宽度,完全不需要调用这个方法。
修复方法
1. 替换获取图片宽度的逻辑
直接使用PHP原生的getimagesize函数读取图片宽度,不会产生额外文件:
// 把else分支中获取宽度的代码替换为下面的内容 // Get width of original image $imageInfo = getimagesize($this['local_path']); $this['width'] = $imageInfo[0] ?? 1600; // 读取失败给个默认宽度 $this['image_from'] = 'media';
2. 可选优化:添加宽度缓存
高访问量场景下可以添加缓存,减少本地文件IO开销:
$cacheKey = 'img_width_' . md5($this['local_path']); // 缓存24小时,可根据需求调整时长 $this['width'] = cache()->remember($cacheKey, 86400, function () use ($local_path) { $imageInfo = getimagesize($local_path); return $imageInfo[0] ?? 1600; });
3. 清理冗余文件
修复代码后可直接删除storage/app/uploads/public目录下的重复全尺寸图片,不影响现有功能。
你的响应式图片生成、resize过滤器逻辑本身没有问题,修改后只会在首次生成对应尺寸缩略图时写入一次文件,不会再重复生成全尺寸副本。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

