用 Python 打通华为云 OBS 图片处理流水线:上传、在线压缩与批量处理实践
内容型业务里,用户上传的图片往往既有体积过大的原图,也有尺寸不一的封面。每次都下发原图,带宽和首屏时间都会很难看。我们把华为云对象存储 OBS 当作唯一图源,上传后借助 OBS 自带的图片处理能力在服务端完成缩放与压缩,客户端只拿处理后的 URL。这条路省掉了自建图片服务器的运维,也不用在业务进程里做耗 CPU 的图像运算。
一、初始化客户端
安装华为云 Python SDK 后,密钥从环境变量读取,配合 IAM 子账号的最小权限策略,初始化时 endpoint 记得带协议头。
client = ObsClient(access_key_id=ak, secret_access_key=sk,
server="https://obs.cn-north-4.myhuaweicloud.com")
二、上传时带上 ContentType
上传后发现浏览器直接下载图片而不是预览,多半是 ContentType 没设置。用 putFile 时在 metadata 里显式指定,并按 origin/年-月/ 的前缀归档,后续遍历处理会方便很多。
三、用处理参数做在线压缩
OBS 支持在 GET 请求上追加 x-image-process 参数,服务端完成缩放压缩,不必落盘中间文件。
https://bucket.obs.cn-north-4.myhuaweicloud.com/a.jpg?x-image-process=image/resize,w_800/quality,q_80
实测一张 3MB 原图压到 800 宽、质量 80 后约 180KB,首屏从 2.1 秒降到 0.6 秒。封面图还可以叠加 format,webp 再降体积。
四、批量处理
批量脚本的核心是先列举再逐条处理:用 listObjects 按前缀拉取对象清单,对每个对象拼出带处理参数的地址,拉取后写回 thumb/ 前缀,配合 CDN 缓存降低回源压力。任务量大时用线程池限流,并发控制在 10 以内。
五、容易踩的坑
第一,签名问题。SDK 默认 v4 签名,自己拼 URL 直连时域名 region 必须与桶一致,否则 403。第二,对象名要 URL 编码,中文或空格不编码会导致处理参数解析失败。第三,批量任务要限流,对 5xx 做指数退避重试。第四,生产环境不要用主账号 AK,只授予目标桶的读、写和列举权限。第五,处理参数统一放配置中心维护,方便调整规格。
六、小结
这条流水线把图片处理能力交给 OBS,业务代码只负责上传、拼 URL 和回收结果,实现成本很低。上线后图片平均体积下降约 70%,带宽费用随之下降。后续要做智能裁剪,可再叠加 ModelArts 推理接口,把识别结果写回对象标签形成闭环。
- 点赞
- 收藏
- 关注作者
评论(0)