「图片的压缩采用OSS方式,也就是说,如果图片是放在本地服务器的, 也就是传到Upload这样的文件夹里面的,就不管它。 如果是传到OSS里面的,你到网上查一下:OSS在获取图片的时候, 好像可以传一个参数,它会给你返回一张压缩过的图片文件。 好像我记得有这么一个功能或者参数,你去查一下。如果可行的话, 就用OSS的压缩就行了。」
阿里云 OSS 图片处理(IMG),取图时在 URL 后加 x-oss-process:
x-oss-process
https://bucket.endpoint/object.jpg?x-oss-process=image/resize,w_400/quality,q_85
支持的常用操作:
resize,w_400
resize,l_1200
quality,q_85
format,webp
interlace,1
要点:
limit_0
?x-oss-process=...
OssDriver::get()
$extra
OssDriver::authorization()
/{bucket}/{key}
media.php
cacheLocally()
⇒ 三处都要改,缺一个都会出错。
public function get(string $key, array $extra = [], string $process = ''): array
$process
?x-oss-process=<process>
canonicalResource = /{bucket}/{key}?x-oss-process=<process>
public static function read(int $familyId, string $key, string $process = ''): array
local
oss
现在的 cacheLocally($key, $body) 会把压缩版写到原 key 的本地路径, 之后所有请求都拿到这个尺寸 —— 必须改:
cacheLocally($key, $body)
缓存路径 = uploads/_proc/<w>/<原key> # 有 process 时 = uploads/<原key> # 无 process(原图)
⚠️ 原图(无 process)仍然缓存 —— 它是最通用的,且下载要用原图。 ⚠️ 压缩版缓存不加进数据库,纯磁盘缓存,可随时删。
不做无限档(每档都要占缓存)。按实际用法定三档:
resize,l_400/quality,q_80
_proc/400/{key}
resize,l_1600/quality,q_85
_proc/1600/{key}
⚠️ x-oss-process 计费:按处理次数收费(约 ¥0.0005/次)。 有本地缓存后,同一张图同一尺寸只处理一次,量不大。 ⚠️ 桶必须开启「图片处理」服务(多数默认开启,私有桶也支持)。
#57 是视频转码(H.265→H.264,必须落盘转);本单是图片取图时实时压缩(不动原图,OSS 侧处理)。两者都涉及媒体体积,但机制完全不同。
No dependencies set.
The note is not visible to the blocked user.
图片走 OSS 实时压缩:本地存储不管,OSS 存储取图时带 x-oss-process
用户需求(2026-11-05)
查证结果:功能确实存在
阿里云 OSS 图片处理(IMG),取图时在 URL 后加
x-oss-process:支持的常用操作:
resize,w_400/resize,l_1200quality,q_85format,webpinterlace,1要点:
limit_0x-oss-process计入签名(canonical resource 追加?x-oss-process=...)现状分析(本项目)
OssDriver::get()$extra,但那是请求头x-oss-process是 query 参数,且要参与签名OssDriver::authorization()/{bucket}/{key}media.phpcacheLocally()回写完整原图⇒ 三处都要改,缺一个都会出错。
设计
① OSS 驱动:支持 query 参数并计入签名
$process非空时,URL 追加?x-oss-process=<process>canonicalResource = /{bucket}/{key}?x-oss-process=<process>(OSS 规范:子资源参数才计入签名;
x-oss-process属于此类)② Storage 门面:透传 process,且只对 OSS 生效
$process为空 ⇒ 原行为local⇒ 忽略$process(用户:"本地的不不管它")oss⇒ 透传③ media.php:按尺寸分不同缓存键
现在的
cacheLocally($key, $body)会把压缩版写到原 key 的本地路径,之后所有请求都拿到这个尺寸 —— 必须改:
⚠️ 原图(无 process)仍然缓存 —— 它是最通用的,且下载要用原图。
⚠️ 压缩版缓存不加进数据库,纯磁盘缓存,可随时删。
尺寸档位
不做无限档(每档都要占缓存)。按实际用法定三档:
resize,l_400/quality,q_80_proc/400/{key}resize,l_1600/quality,q_85_proc/1600/{key}验收
x-oss-process请求返回压缩版(体积明显变小)风险
⚠️
x-oss-process计费:按处理次数收费(约 ¥0.0005/次)。有本地缓存后,同一张图同一尺寸只处理一次,量不大。
⚠️ 桶必须开启「图片处理」服务(多数默认开启,私有桶也支持)。
为什么单独建单
#57 是视频转码(H.265→H.264,必须落盘转);本单是图片取图时实时压缩(不动原图,OSS 侧处理)。两者都涉及媒体体积,但机制完全不同。