适配:Web 官网后台、Admin 移动端后台、产品编辑页面、前台 PC+Flutter 买家 App、Google Shopping Feed
兼容现有架构:MySQL + Redis + FileCache、Nginx 静态资源托管、多语言产品体系
一、整体需求梳理
- 后台产品新增 / 编辑页面:上传多张产品图片;编辑产品时自动加载历史已上传图片,支持勾选保留、删除、新增图片
- 图片上传完成后自动处理:压缩体积、生成多尺寸缩略图、统一转为 WebP(兼容原图备用)
- 前台产品列表、详情页、App、Google Shopping 分别调用对应尺寸图片,大图不阻塞页面加载,提升 Core Web Vitals 指标
- 文件统一本地服务器存储,不依赖第三方图床;JS/CSS/ 图片资源本地部署架构保持统一
- 支持产品主图、多图相册、详情长图区分处理规则
二、图片标准化处理规则(后端服务统一执行)
2.1 支持上传格式
允许:jpg,jpeg,png
禁止:bmp、tiff、psd 等超大格式;上传时前端先拦截校验
2.2 上传前端预处理(浏览器先压缩,减少上行流量)
- 前端限制单张原始文件最大:8MB
- 浏览器端使用 Canvas 轻度压缩后再提交后端,弱网海外管理员上传更快
2.3 后端自动生成 3 套规格(强制)
全部自动生成,无需人工操作
- 原图(original) 路径:
/upload/product/original/xxxx.webp用途:后台编辑预览、客户下载高清图、Google Shopping 原始素材备用 长边限制:1920px,品质 85 - 列表缩略图(thumbnail) 路径:
/upload/product/thumb/xxxx.webp尺寸:400 × 400px 等比例裁切居中(产品封面正方形) 用途:官网产品列表、App 商品列表、侧边推荐商品 - 详情展示图(detail) 路径:
/upload/product/detail/xxxx.webp长边限制:1200px,等比例缩放,不裁切 用途:产品详情页相册、放大预览弹窗
统一输出格式:WebP;同时保留一份 jpg 兼容降级(老旧浏览器自动 fallback)
2.4 命名规范(防重复、方便清理缓存)
采用 {product_id}_{uuid}_{timestamp}.webp
避免中文、空格、特殊符号;Nginx 伪静态、CDN 缓存友好
三、后台页面交互逻辑(产品新增 / 产品编辑)
3.1 新增产品页面
- 图片上传区域:支持拖拽上传 + 点击选择文件,支持批量多选
- 实时预览上传队列,显示上传进度条
- 可拖拽排序图片顺序(排序数值存入数据库,前台按顺序展示)
- 标记第一张为【产品主图】,同步同步至 Google Shopping Feed
3.2 编辑产品页面【重点需求】
- 进入编辑接口自动读取数据库中已绑定的图片列表
- 页面加载完成后渲染所有历史图片预览,显示现有图片排序
- 操作功能:
- 拖拽调整已有图片顺序
- 点击删除单张图片(标记删除,提交保存后物理清理文件)
- 继续新增上传新图片
- 重新指定主图
- 提交保存逻辑:
- 保留图片:继续关联产品 ID
- 删除图片:数据库解除关联;后台定时任务清理无引用孤立图片文件(防止磁盘堆积)
3.3 数据库存储设计
产品图片表独立数据表(不塞进 JSON 字段,方便查询、排序、清理)
plaintext
id
product_id // 关联产品ID
image_sort // 排序序号
is_main // 是否为主图 1=是 0=否
original_path // 原图路径
thumb_path // 缩略图路径
detail_path // 详情图路径
created_at
updated_at
四、前台展示调用规范(Web + Flutter App)
- 产品列表页面:统一加载
thumb400×400 缩略图,开启图片懒加载 - 产品详情相册:加载
detail1200 图;点击弹窗放大展示original - Flutter 买家 App 完全复用同一套图片地址,自动适配手机屏幕
- Google Shopping Feed 读取主图
original_path,满足平台白底高清图片要求 - HTML 图片标签统一写入
alt="{产品名称 多语言}",对 SEO 友好
五、Nginx 静态资源优化配置(配套方案)
nginx
location ~* ^/upload/product/ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
try_files $uri $uri.jpg;
}
- 长缓存头,减少重复请求
- WebP 优先识别,浏览器不支持自动访问 jpg 备用图
六、缓存联动策略(配合 Redis + FileCache)
- 产品数据缓存(Redis)中同步存储图片路径数组
- 更新 / 删除产品图片 → 主动清除该产品 Redis 缓存与 FileCache
- 避免前台读取旧缓存展示失效图片
七、定时维护任务(可选,运维优化)
- 每日凌晨执行:扫描图片目录,删除数据库无关联的孤立图片,释放服务器磁盘
- 定期校验图片文件完整性,失效图片在前台自动隐藏
八、异常容错机制
- 图片文件损坏、路径 404:前台展示默认产品占位图
- 上传超时、服务器繁忙:前端提示重试,不阻塞整个产品表单
- 批量上传失败支持断点续传简易方案
九、开发任务清单
- 前端上传组件:拖拽、多选、进度展示、排序、主图标记
- 编辑页面接口:读取历史图片并渲染预览
- 后端图片处理服务:自动压缩、生成三套尺寸、转 WebP
- 产品图片数据表设计
- 保存逻辑:新增 / 编辑图片关联、软删除标记
- 前台页面改造:列表调用 thumb、详情调用 detail、懒加载
- Flutter App 图片地址适配、图片缓存策略
- Nginx 静态资源缓存配置
- 定时清理孤立图片脚本
- Google Shopping Feed 对接主图路径
如果你需要,我可以输出:
- 图片上传接口标准 API 文档
- 产品编辑页面前端交互流程图
- PHP / 后端图片处理伪代码示例