跳到主要内容

eo+对象存储 在线图床方案

最后更新于:

eo+对象存储 在线图床方案

需求

 1🟢方案名称
 2eo+对象存储 在线图床方案
 3
 4🟢功能需求
 51.我可以通过密码登录这个oneimg.onedayxyy.cn域名后台,然后上传图片
 62.图片可以默认转成avif/webp等格式
 73.图床支持各种图片的预览
 84.图床可以备份数据到其他对象存储或者git仓库(扩展功能)
 9
10🟢项目背景
111.我这里可以提供的是 七牛云的key/scret/存储桶(这些我已经存在了cnb的secrt仓库了 https://cnb.cool/onedayxyy/secret/-/blob/main/envs.yml,或者放在eo pages里的kv里也可以),eo pages里的kv(或者eo云函数,eo边缘函数),一个oneimg.onedayxyy.cn域名(作为图床使用)122.其实,我正在开发的这个oneblog后台已经实现了这图床功能,通过登录https://oneblogadmin.onedayxyy.cn/后台,即可上传到自己的图库。只是没实现图片压缩转换功能,这个功能应该通过eo/eo云函数也可以实现的(具体如何实现,你自己看着办,我不太懂)。另外,我希望这图床是单独的一个项目,而不是依赖在我这个oneblog图床后台。
13
14🟢建议
15图床可以参考开源项目piclist:
16开源文档:https://piclist.cn/
17开源项目:https://github.com/Kuingsmile/PicList
18说明:
19直接基于piclist项目二开成我需要的项目都行,如果你认为这个项目太重了,或者自己写代码页可以,反正你看着办;
20也可以参考我这个oneblog后台已经实现了的图床功能;
21
22
23🟢最后
24请按以上需求给我规划一些可行的方案,并给出意指导,我再考虑需要选择哪一个方案。

需求v2

 1🟢方案名称
 2eo+对象存储 在线图床方案
 3
 4🟢功能需求
 51.我可以通过密码登录这个oneimg.onedayxyy.cn域名后台,然后上传图片
 62.图片可以默认转成avif/webp等格式
 73.图床支持各种图片的预览
 84.图床可以备份数据到其他对象存储或者git仓库(扩展功能)
 9
10🟢项目背景
111.我这里可以提供的是 七牛云的key/scret/存储桶(这些我已经存在了cnb的secrt仓库了 https://cnb.cool/onedayxyy/secret/-/blob/main/envs.yml,或者放在eo pages里的kv里也可以),eo pages里的kv(或者eo云函数,eo边缘函数),一个oneimg.onedayxyy.cn域名(作为图床使用)122.其实,我正在开发的这个oneblog后台已经实现了这图床功能,通过登录https://oneblogadmin.onedayxyy.cn/后台,即可上传到自己的图库。只是没实现图片压缩转换功能,这个功能应该通过eo/eo云函数也可以实现的(具体如何实现,你自己看着办,我不太懂)。另外,我希望这图床是单独的一个项目,而不是依赖在我这个oneblog图床后台。
13
14🟢建议
15图床可以参考开源项目piclist:
16开源文档:https://piclist.cn/
17开源项目:https://github.com/Kuingsmile/PicList
18说明:
19直接基于piclist项目二开成我需要的项目都行,如果你认为这个项目太重了,或者自己写代码页可以,反正你看着办;
20也可以参考我这个oneblog后台已经实现了的图床功能;
21
22
23🟢最后
24请按以上需求给我规划一些可行的方案,并给出意指导,我再考虑需要选择哪一个方案。

oneimg 在线图床:方案选型与实施指导

现状结论(可复用资产)

你已经具备大半能力,缺的主要是「独立项目」和「格式转换」:

能力现状
密码登录[oneblog-admin/functions/index.js](oneblog-admin/functions/index.js) JWT + Cookie
上传到七牛[oneblog-admin/functions/lib/qiniu.js](oneblog-admin/functions/lib/qiniu.js)(EO Web Crypto,无 Node 依赖)
图库/预览/相册[admin-frontend/src/views/Content/Gallery.vue](admin-frontend/src/views/Content/Gallery.vue) + API /api/v1/gallery/*
元数据EO KV:gallery_items / gallery_albums
密钥Pages 环境变量或 KV(QINIU_AK/SK/BUCKET/DOMAIN),与 CNB secret 仓库可对齐
转码未实现

公开访问域名建议继续用现有 CDN 域名(如 img.onedayxyy.cn / oneblogoss.onedayxyy.cn),oneimg.onedayxyy.cn 专做管理后台;也可同域分路径(/admin + /i/*),但拆域名更清晰。


转码的三种技术路径(先理解再选型)

这是方案差异的核心,不是「写不写代码」的问题:

flowchart LR upload[浏览器上传] --> api[EO Pages 云函数] api --> qiniu[七牛对象存储原图] qiniu --> pathA[路径A 访问侧自适应] qiniu --> pathB[路径B 上传后 pfop 落盘] pathA --> cdn[EO 或七牛 CDN 按 Accept 转 AVIF/WebP] pathB --> stored[空间内另存 .avif/.webp] stored --> url[固定转换后 URL]
  1. 访问侧自适应(推荐优先)

    原图照常存;访问时由 EdgeOne 图片即时处理七牛 CDN 格式自适应 按浏览器 Accept 返回 AVIF/WebP。

    • 优点:实现最快、兼容好、零改上传链路、动图可回退原图
    • 缺点:存储仍是原图;依赖 CDN 图片处理计费/配额
  2. 上传后落盘转码(七牛 pfop / imageMogr2)

    上传策略带 persistentOps,或上传后调 pfop:imageMogr2/format/avif|saveas/...

    • 优点:链接可固定为 .avif,与博客现有写法一致
    • 缺点:异步、回调/轮询、高级压缩可能计费、实现稍重
  3. 边缘函数里用 sharp 等本地转码

    在 EO 边缘/云函数内解码再编码。

    • 不推荐:运行时对原生编解码支持差、体积与超时受限,性价比低于 1/2

建议落地策略: MVP 用路径 1;若你强烈要求「上传后文件名就是 .avif」,再加路径 2。


四个可行总方案对比

方案 A(推荐):轻量独立「oneimg」= 剥离 oneblog 图库 + EO + 七牛

形态: 新仓库(或 monorepo 新目录 oneimg/),独立 EO Pages 项目,绑定 oneimg.onedayxyy.cn

组成:

  • 前端:从 Gallery / Upload 精简出登录 + 上传 + 列表预览 + 删除(Vue 或更轻的单页均可)
  • 后端:复用/精简 qiniu.js + 密码登录 + /api/upload /api/list /api/delete
  • 存储:七牛桶;元数据:EO KV(可只存索引,也可列表直接打七牛 list API)
  • 转码:EO/七牛 访问侧自适应(一期);可选二期 pfop 落盘
  • 备份:二期定时同步到第二桶或 Git LFS/裸文件仓

工作量: 约 3–7 天(有现成代码) 匹配度: 与你现有技术栈完全一致,真正「独立于 oneblog」,又能复用经验。


方案 B:七牛为主 + PicList 桌面端(弱 Web 后台)

形态: 继续用 PicList 上传到七牛;CDN 套 EO/ESA;Web 端只做只读相册或极简密码上传页。

匹配度: 你文档里已有「七牛 + CDN + PicList」实践,上传体验好。 缺口: 需求 1「密码登录后台上传/管理」不完整;备份、统一预览后台要另做。 结论: 适合当 客户端补充,不宜作为主方案。


方案 C:基于 PicList 二开成 Web 图床

形态: Fork PicList(Electron + PicGo 生态)。

问题: PicList 本质是桌面客户端,不是 EO Pages 可部署的 Web 服务;要改成 oneimg.onedayxyy.cn 后台等于重写部署模型。 结论: 过重,不建议。需要桌面一键上传时,直接装官方 PicList 连同一七牛桶即可。


方案 D:继续挂在 oneblog,只加转码

形态: 在现有 oneblogadmin 图库上开 EO/七牛自适应或 pfop。

优点: 改动最小。 缺点: 明确违背「希望图床是单独项目」。 结论: 仅作临时过渡;长期仍应抽到方案 A。


推荐架构(方案 A 详细)

flowchart TB subgraph admin [oneimg.onedayxyy.cn] ui[管理前端] fn[EO Pages Functions] kv[EO KV 密钥与索引] end subgraph storage [对象存储与分发] qiniu[七牛 Bucket] cdn[图片 CDN 域名] end user[你] -->|密码登录| ui ui -->|上传/列表/删除| fn fn --> kv fn -->|UpToken 或服务端代传| qiniu blog[博客/外链] -->|读图| cdn cdn -->|回源 + 格式自适应| qiniu fn -.->|二期备份| backup[第二桶或 Git]

一期(必须满足需求 1–3)

  1. 独立 EO Pages 项目 + 域名 oneimg.onedayxyy.cn
  2. 密码登录(可复用 oneblog 的 JWT/Cookie 模式,密钥放 KV)
  3. 上传 / 列表 / 预览 / 删除 / 复制 URL
  4. 七牛凭证:Pages 环境变量或 KV(与 CNB secret envs.yml 同源配置即可)
  5. 图片访问域名 开启 AVIF/WebP 自适应(EO 控制台一键,或七牛 CDN 自适应)
  6. 后台预览:<img> + 灯箱即可;GIF/动图预览原图,静图走自适应

二期(需求 4 扩展)

  • 备份到第二对象存储:云函数定时 list + 复制(或七牛跨桶/镜像)
  • 备份到 Git:仅适合小图/低频;大图床不建议 Git 主存,可用「元数据 JSON 进 Git + 文件进第二桶」
  • 可选:上传策略 pfop,默认另存 xxx.avif,返回转换后 URL

明确不做

  • 不以 PicList 为服务端底座
  • 不在 EO 边缘函数内自研 sharp 转码
  • 不把 oneblog 文章/Git 写库逻辑拖进图床项目

与「oneblog 图床」的关系建议

  • 代码: 复制精简,不要 runtime 依赖 oneblog-admin
  • 存储: 可共用同一七牛桶,用前缀区分(如 oneimg/ vs gallery/),或新开桶更干净
  • 产品: oneblog 后台可后续改成「外链打开 oneimg」或继续本地上传到同一桶;互不影响

选型建议(一句话)

方案 A + 访问侧自适应转码;PicList 仅作本机上传工具;备份放二期;若必须「文件本身变成 avif」,再叠加七牛 pfop。


你确认选型后,实施顺序(方案 A)

  1. 建独立项目骨架(EO Pages:public/ + functions/ + edgeone.json
  2. 迁入登录 + qiniu.js + 上传/列表 API
  3. 做极简图库 UI(预览、复制链接、删除)
  4. 配置 oneimg 域名与七牛密钥
  5. 在图片 CDN 上打开 AVIF/WebP 自适应并验收

6.(可选)pfop 落盘与备份任务

确认采用方案 A(或你指定其他方案)后,再进入具体编码与仓库拆分。

结论

基于你已有的 EO Pages + 七牛能力,推荐新建轻量独立图床项目 oneimg(剥离 oneblog 图库核心),转码优先走访问侧自适应,备份作为二期扩展;PicList 仅作桌面客户端,不作为服务端底座。

已选择方案A

 1🟢细节
 2oneimg.onedayxyy.cn 图床域名
 3oneimgadmin.onedayxyy.cn 图床管理后台域名
 4
 5
 6仓库名称:
 7oneimg
 8
 9---
10转码方式:(直接选择这种,需确认是否收费??)
11上传后落盘转码(七牛 pfop / imageMogr2)
12上传策略带 persistentOps,或上传后调 pfop:imageMogr2/format/avif|saveas/...。  
13
14优点:链接可固定为 .avif,与博客现有写法一致  
15缺点:异步、回调/轮询、高级压缩可能计费、实现稍重
16
17---
18方案 A(推荐):轻量独立「oneimg」= 剥离 oneblog 图库 + EO + 七牛
19形态: 新仓库(或 monorepo 新目录 oneimg/),独立 EO Pages 项目,绑定 oneimg.onedayxyy.cn。
20
21组成:
22    前端:从 Gallery / Upload 精简出登录 + 上传 + 列表预览 + 删除(Vue 或更轻的单页均可)
23    后端:复用/精简 qiniu.js + 密码登录 + /api/upload /api/list /api/delete
24    存储:七牛桶;元数据:EO KV(可只存索引,也可列表直接打七牛 list API)
25    转码:EO/七牛 访问侧自适应(一期);可选二期 pfop 落盘
26    备份:二期定时同步到第二桶或 Git LFS/裸文件仓
27
28工作量: 约 3–7 天(有现成代码)
29匹配度: 与你现有技术栈完全一致,真正「独立于 oneblog」,又能复用经验。
30
31---

问题

问题

 1就选择 方案 A(推荐):轻量独立「oneimg」= 剥离 oneblog 图库 + EO + 七牛。
 2
 3oneimg.onedayxyy.cn 图床域名
 4oneimgadmin.onedayxyy.cn 图床管理后台域名
 5
 6新cnb仓库名称:oneimg
 7
 8 9唯一注意的是:我需要图片必须转为avif/webp。
10转码方式:(直接选择这种)
11上传后落盘转码(七牛 pfop / imageMogr2)
12上传策略带 persistentOps,或上传后调 pfop:imageMogr2/format/avif|saveas/...。  
13
14优点:链接可固定为 .avif,与博客现有写法一致  
15缺点:异步、回调/轮询、高级压缩可能计费、实现稍重
16
17但我不知道这个转换会收费不?
18
19

回答

oneimg 在线图床:已锁定实施方案

已确认决策

选择
总方案方案 A:轻量独立 oneimg = 剥离 oneblog 图库 + EO + 七牛
CNB 仓库oneimg(新仓,不挂在 hugo-teek-private)
图床访问域名oneimg.onedayxyy.cn
管理后台域名oneimgadmin.onedayxyy.cn
转码必须:上传后七牛 pfop / imageMogr2 落盘
默认输出固定链接为 .avif(与博客现有写法一致);可选同时产出 .webp
备份二期扩展

转码会收费吗?(结论)

会,但个人博客量级通常极低;且 pfop 落盘是「上传时计一次」,不是每次访问都计。

依据七牛官方 按量计费 / AVIF 压缩 / 价格页

AVIF(imageMogr2/format/avif)——明确按「图片高级压缩」计费

输出分辨率档位 × 处理次数(千次):

输出规格约价(中国大陆)
800×600 及以下0.075 元/千次
1600×1200 及以下0.3 元/千次
3200×2400 以下1.6 元/千次
6400×4800 以下5.4 元/千次

直觉换算(个人站):

  • 每月上传 100 张、平均落在 1600×1200 档 → 约 100 × 0.3 / 1000 ≈ 0.03 元
  • 每月上传 1000 张同规格 → 约 0.3 元

另存后的 .avif 再被浏览时,不再因转码重复收费(只剩存储 + CDN/回源流量,与现在图床类似)。

WebP(imageMogr2/format/webp

WebP 属于普通格式转换,走 imageMogr2 体系,不是「图片高级压缩-AVIF」那一档。官方价目里 imageMogr2imageView2 等同组,有较大免费处理量(按处理数据量计,非 AVIF 那种按千次档位)。相对 AVIF 通常更便宜或接近免费额度内。

实施建议(控费)

  1. 默认只落盘 AVIF(满足博客 .avif 写法);WebP 做成可选开关,避免双倍处理费。
  2. 超大图可先限制最长边再转码(降低档位与费用)。
  3. GIF/动图:AVIF 动图支持有限,可约定「静图转 AVIF,动图保留原格式或转 WebP 动图」。
  4. 原图是否保留:建议短期保留 _raw/ 前缀便于失败重试,稳定后可删原图省存储。

价格以七牛控制台/账单为准,上线后用小流量实测一笔即可确认。


目标架构

flowchart TB subgraph admin [oneimgadmin.onedayxyy.cn] ui[管理前端] fn[EO Pages Functions] kv[EO KV 密码密钥与图库索引] end subgraph storage [存储与访问] qiniu[七牛 Bucket] pfop[pfop imageMogr2 落盘] cdn[oneimg.onedayxyy.cn] end user[你] -->|密码登录| ui ui -->|上传列表删除| fn fn --> kv fn -->|上传原图| qiniu qiniu --> pfop pfop -->|saveas xxx.avif| qiniu fn -->|轮询或回调后写索引| kv blog[博客外链] -->|https://oneimg.../xxx.avif| cdn cdn -->|回源| qiniu

上传与转码流程(一期核心)

  1. 登录后台,选择图片上传。
  2. Functions 将原图写入七牛(如 raw/2026/xxx.png)。
  3. 触发持久化:imageMogr2/format/avif|saveas/<EncodedEntryURI>(上传策略 persistentOps,或上传成功后调 pfop API)。
  4. 轮询 persistentId 或接收 persistentNotifyUrl 回调。
  5. 成功后:图库索引写入最终 URL https://oneimg.onedayxyy.cn/.../xxx.avif;后台预览与复制均用该地址。
  6. 失败:标记失败并允许重试;可选保留原图。

优先实现路径:上传后调 pfop(逻辑清晰、易排错);稳定后再考虑写入上传策略 persistentOps 减少一次 API。


可复用资产(从 oneblog 剥离,不依赖运行)

  • 七牛签名/上传:[oneblog-admin/functions/lib/qiniu.js](oneblog-admin/functions/lib/qiniu.js)
  • 登录模式:[oneblog-admin/functions/index.js](oneblog-admin/functions/index.js) JWT + Cookie
  • 图库 UI 参考:[admin-frontend/src/views/Content/Gallery.vue](admin-frontend/src/views/Content/Gallery.vue)
  • 图库 API 参考:oneblog-admin/functions/[[default]].js/api/v1/gallery/*

新仓只保留图床所需最小集,不带文章/Git/Hugo 配置逻辑。


域名与部署

域名用途部署
oneimgadmin.onedayxyy.cn密码后台EO Pages(新仓 oneimg
oneimg.onedayxyy.cn图片公网 URL七牛 CDN 加速域名(或 EO 回源七牛),对外只读

密钥:QINIU_AK/SK/BUCKET/DOMAIN、后台密码 → EO Pages 环境变量或 KV;可与 CNB secret envs.yml 对齐。

存储桶:新建专用桶更干净;若共用现有桶,统一前缀 oneimg/


一期范围

  1. 新建 CNB 仓库 oneimg + EO Pages 骨架
  2. 密码登录后台(oneimgadmin
  3. 上传 / 列表 / 预览 / 删除 / 复制 AVIF URL
  4. 七牛上传 + pfop 落盘 AVIF(可选 WebP)
  5. 绑定双域名并验收「复制出来的链接直接是 .avif

二期范围

  • 备份到第二对象存储或 Git(元数据进 Git、文件进第二桶更稳妥)
  • 批量历史图转码、原图清理策略

明确不做

  • 不以 PicList 为服务端底座(桌面端可另装,连同一桶)
  • 不做访问侧自适应作为主转码路径(已否决)
  • 不在 EO 函数内用 sharp 本地转码
  • 不依赖 oneblog-admin 运行时

实施顺序

  1. 建仓 oneimg,初始化 EO Pages 项目
  2. 登录 + 七牛上传/列表/删除
  3. 接入 pfop 落盘 AVIF + 状态轮询/回调
  4. 图库 UI 与复制最终 URL
  5. 绑定 oneimgadmin / oneimg 并端到端验收
  6. (二期)备份

结论

已锁定方案 A:新建 CNB 仓库 oneimg,独立 EO Pages 管理后台(oneimgadmin)+ 图床访问域名(oneimg),七牛存储,上传后经 pfop/imageMogr2 落盘为 AVIF(可选 WebP)。备份为二期。

已确认选方案 A,并锁定 pfop 落盘转码。正在查七牛 AVIF/WebP

会收费,但个人图床量级通常可以忽略;而且是「每张图转码时收一次」,不是每次打开网页都收。

AVIF(你选的落盘方式)

七牛把 imageMogr2/format/avif 算作图片高级压缩,按输出分辨率档位 × 次数计费(官方价目):

输出规格约价
≤800×6000.075 元/千次
≤1600×12000.3 元/千次
≤3200×24001.6 元/千次
≤6400×48005.4 元/千次

举例:一个月转 100 张、大多在 1600×1200 档 → 大约 3 分钱;1000 张 → 大约 3 毛。 转完存成 .avif 后,访问只走存储/流量,不会再为转码重复扣费。

WebP

走普通 imageMogr2 格式转换,不是 AVIF 那档高级压缩价,一般更便宜或落在免费额度里。建议默认只落盘 AVIF(和博客现有链接一致),WebP 做成可选,避免一张图转两次。

已完成

已完成

  • EO Pages 骨架:edgeone.jsonfunctions/public/
  • 密码登录 + 图库后台(上传 / 预览 / 复制 / 删除 / 重试)
  • 七牛上传 + pfop 落盘 AVIF(可选 WebP)
  • 备份 API:第二桶复制 + Git 元数据导出
  • 域名部署说明:DEPLOY.mdREADME.md

你需要手动完成的两步

  1. 建 CNB 仓并推送(当前 Token 缺 group-resource:rw,无法代建) 见 CREATE_CNB_REPO.md:在 cnb.cool 创建 onedayxyy/oneimg,然后:

    cd D:\oneimg

    git push -u origin master

  2. DEPLOY.md 绑定域名

    • oneimgadmin.onedayxyy.cn → EO Pages + KV(ADMIN_KV) + 环境变量
    • oneimg.onedayxyy.cn → 七牛 CDN(QINIU_DOMAIN

上传成功后复制到的链接形态为:https://oneimg.onedayxyy.cn/oneimg/.../xxx.avif

FAQ

最新文章

文档导航