S3、R2 与 MinIO
内置 AWS S3 图床可连接 Amazon S3、Cloudflare R2、MinIO 与兼容 S3 API 的服务。图床 ID 为 aws-s3-plist,无需额外安装 S3 插件。
本教程以 R2 为例,完成“准备存储桶 → 填写 PicList → 上传测试 → 验证公开链接”。如果已经有存储桶和凭据,直接跳到填写字段。
准备存储桶与连接信息
- 在 Cloudflare 控制台进入 R2,创建一个存储桶,例如 docs-images。
- 在 R2 的 API 令牌管理入口创建用于 S3 的账号或用户令牌,选择目标桶所需的 对象读写权限。
- 将生成的 Access Key ID 和 Secret Access Key 保存到自己的安全位置。它们是 S3 凭据;不要把一般的 Cloudflare API Token 填进 S3 密钥字段。
- 复制该账号 / 辖区对应的 S3 API endpoint。普通账号的示例是 https://ACCOUNT_ID.r2.cloudflarestorage.com。
以控制台当前显示的字段为准,操作入口和凭据生成说明见 R2 S3 快速开始与令牌文档。
这里还没有配置公开图片访问。上传权限与公开读取需要分别准备。
在 PicList 填写字段
展开 图床 → AWS S3,添加新配置。建议命名为 Blog R2,填写下面的字段后点击确认,再选择卡片与默认图床。
| 字段含义 / JSON 字段 | R2 示例 | 如何填写 |
|---|---|---|
| 配置名 | Blog R2 | PicList 中用于区分配置的名字 |
| Access Key ID / accessKeyID | 本地填写 | 上一步生成的 S3 Access Key ID |
| Secret Access Key / secretAccessKey | 本地填写 | 对应的 S3 Secret Access Key |
| 存储桶 / bucketName | docs-images | 完整桶名;不填 URL |
| 地区 / region | auto | R2 使用 auto |
| 接口地址 / endpoint | https://ACCOUNT_ID.r2.cloudflarestorage.com | 复制你实际使用的 S3 endpoint |
| 上传路径 / uploadPath | docs/ | 在桶内创建对象的目录前缀 |
| 公开 URL 前缀 / urlPrefix | https://images.example.com | 已连接到桶的公开域名 |
| 路径风格 / pathStyleAccess | 按服务要求 | 初次使用可保留默认;兼容服务按其要求设置 |
| URL 不加桶名前缀 / disableBucketPrefixToURL | 按 URL 映射设置 | 路径风格开启且域名已经指向桶根时,避免重复桶名 |
| 对象 ACL / acl | auto | 不发送 ACL 请求头 |
region 与 endpoint 的依据见 R2 S3 API 兼容说明。全部示例使用占位账号与域名,请替换成自己的值。
auto 的作用
PicList 3.6 / Core 3.0 中,ACL 选择 auto 会省略 ACL 请求头。它不会开放存储桶访问;公开读取仍由服务端的域名与访问策略决定。
给读者准备公开访问地址
用于长期文章图片时,应先把一个可公开访问的地址连接到桶,再填写 urlPrefix。
R2 的自定义域名操作:打开桶的 Settings → Custom Domains → Add,输入同一 Cloudflare 账号下的域名,按向导连接并等待状态可用。测试用途也可以使用 Public Development URL,但 r2.dev 有速率限制,不适合作为生产图床域名。具体条件见 R2 公开存储桶文档。
只有准备公开的文件才放入这个桶。PicList 填写公开域名只改变生成的链接,实际开放访问在存储服务端完成。
上传路径如何变成图片链接?
假设配置为 bucketName = docs-images、uploadPath = docs/、urlPrefix = https://images.example.com,文件名为 photo.png:
| 位置 | 结果 |
|---|---|
| 存储桶 | docs-images |
| 桶内对象键 | docs/photo.png |
| 域名指向桶根时的公开链接 | https://images.example.com/docs/photo.png |
开启 pathStyleAccess 时,PicList 默认会在自定义 URL 前缀后加桶名。若你的域名已经对应桶根,启用 disableBucketPrefixToURL;否则可能出现不需要的 /docs-images/ 段。根据服务的实际 URL 映射决定,不要只为了隐藏报错反复切换。
如果文件名模板本身还含目录,最终路径也会受自动命名影响。
用一张图片验证
- 回到上传,确认顶部显示 AWS S3 和你的配置名。
- 上传一个小 PNG。到 R2 控制台打开桶,确认 docs/ 下出现该文件。
- 在 PicList 相册复制 URL,在未登录存储控制台的浏览器窗口打开。
- 确认可读取图片,再切换为 Markdown 粘贴到文章编辑器。
| 现象 | 优先检查 |
|---|---|
| 连接超时或无法解析 | endpoint 拼写、HTTPS、网络、代理 |
| AccessDenied / 403 上传失败 | 凭据是否对应目标账号,令牌能否写目标桶 |
| ACL 相关错误 | 使用 auto;检查服务是否支持对象 ACL |
| 桶内有文件,公开链接 404 | 域名是否已连到桶,URL 的目录或桶名是否重复 |
| 公开链接 403 | 桶的公开访问、域名策略、签名是否过期 |
| 刚上传正常,一段时间后失效 | 是否使用了临时签名地址 |
没有公开 URL 前缀且 ACL 非公开时,S3 图床可能返回约一小时有效的签名 URL。需要长期展示时,配置实际可用的公共服务地址。
Amazon S3 与 MinIO
Amazon S3 使用实际桶地区和该服务对应的接口。auto 让服务端的桶策略与对象所有权设置决定访问行为;只有服务明确支持且需要时才选择其他 ACL。
MinIO 使用部署提供的 S3 endpoint、桶和凭据。它常使用路径风格访问;确认地址是 S3 API,而不是管理控制台登录页。公共网站或 CDN 域名可以与 S3 API 不同。
配置完成后仍执行上面的写入与匿名读取验证。要浏览或操作已有对象,再添加云端管理配置。