后台上传商品图时能看到缩略图,点保存再打开商品,图片栏空了。上传预览读取的通常是临时文件,保存商品时才会把文件移动到正式目录并写入媒体库关系,所以我会把这两段分开查。

保存前后盯住同一个文件名

上传完成先在 pub/media/catalog/product/tmp 找到文件,保存后再看它有没有进入正式的 catalog/product 分散目录。tmp 有、正式目录没有,先看文件移动、磁盘和权限;正式文件存在但后台没有记录,再查数据库。

df -h
df -i
find pub/media/catalog/product/tmp -type f -mmin -10
tail -f var/log/system.log var/log/exception.log

inode 用完时磁盘容量可能仍显示有空间。跨挂载点移动、SELinux、安全扫描占用文件,也会让 rename 或 copy 失败。不要直接把 media 改成 777,先确认 PHP-FPM 与部署用户的 owner、group 和 umask。

文件已经进正式目录,就查媒体库三层关系

对照一个正常商品,检查 media gallery 主记录、store view 的 value 记录和商品关联。只写了文件名但没关联 entity,文件会一直躺在磁盘上,后台却看不到。不同 Magento 版本表结构不同,先用当前库的 schema 确认字段再查询。

图库里有图片但前台角色图空白时,再看 image、small_image、thumbnail 是否在当前 store view 被覆盖为 no_selection。这和整张图库记录丢失不是同一个问题。

多节点环境要确认tmp和正式media是不是同一份

上传请求落在 A 节点,保存请求落在 B 节点,而 tmp 目录没有共享,就会随机消失。使用对象存储时还要看上传、复制和读取是否都走同一套 remote storage 配置。靠 sticky session 只能暂时遮住问题,不能替代共享媒体设计。

修复后分别上传小 JPG、大 PNG、同名文件,并从两台后台节点各测一次。后台图库、数据库关系、原图 URL 和缓存图 URL 都正常,才算完整通过。