图片不显示、上传失败与存储问题
上传报错、图片破图、海报图不显示与附件占满磁盘的排查,含本地与云存储两类配置。
一、先分清是上传失败还是显示失败
上传失败通常在提交时直接报错或一直转圈;显示失败则是文件已存在、页面上却是破图。先到后台附件管理看是否已生成这条记录:没有记录说明上传没成功,有记录但前台不显示,问题就在读取与存储环节。
二、上传失败排查
- 目录权限:
upload/必须存在且 PHP-FPM 用户(www)可写,属主与权限参见「目录权限与写入失败」一篇。 - PHP 限制:图片超过
upload_max_filesize或post_max_size会被拒收,调大后重载 PHP-FPM。 - 扩展缺失:缩略图、水印依赖 gd,类型识别依赖 fileinfo,缺哪个补哪个。
- 临时目录:
upload_tmp_dir不可写时上传会中断,指向站点可写目录即可。
ls -ld /www/wwwroot/你的域名/upload
php -i | grep -E 'upload_max_filesize|post_max_size|upload_tmp_dir'
tail -n 50 /www/server/php/82/var/log/php-fpm.log
三、图片不显示
- 本地存储:检查文件是否真实存在、URL 是否带了正确域名。站点迁移后,旧记录里的绝对地址可能仍指向老域名。
- 云存储:后台「上传设置」把存储方式切到阿里云或腾讯云后,需把 AccessKey、存储桶名与地域结点填对。阿里云 OSS 的 Bucket 读权限设为「公共读」;腾讯云存储桶权限设为「公有读私有写」。任一项填错,图片都会链不上。
四、海报中图片不显示(跨域)
海报是把图片绘制到画布上再导出的,云存储若未放行跨域请求,画布读取图片会被浏览器拦截,海报里就留白。到云存储的跨域设置中新建规则:来源填 * 或你的域名,允许 Methods 勾选 GET,并勾选返回 vary:origin,保存后海报中的图片即可正常显示。
五、水印的配置顺序
水印图片本身也要存放在云存储中。正确顺序是先把云存储接口配置好并测试通过,再重新上传一次水印图片,之后再开才不出错。
六、附件与磁盘清理
运营久了会出现大量无用图片:用户传了却没发布,或信息已删除图片却留着。在后台「附件管理」中可按状态处理:
| 附件状态 | 含义 | 处理 |
|---|---|---|
| 正常 | 仍被信息或商家引用 | 保留 |
| 等待 | 已上传但未发布,超时后转为过期 | 观察 |
| 过期 | 已无人引用 | 可删除 |
筛选“过期”后全选执行删除;若文件此前已在服务器上手工删掉,选「不包括文件」只删记录,避免报错。「删除过期附件」还能按日期批量清理。若附件记录数少于服务器上的实际文件数,先执行检测再导入附件,把无记录的文件纳管,然后筛选、检测、清理,才不会误删还在用的图片。
du -sh /www/wwwroot/你的域名/upload
find /www/wwwroot/你的域名/upload -type f | wc -l
提示:真正释放空间的是文件而不是记录,清理后用上面的命令核对目录体积是否下降。