Amazon S3
引擎: S3 兼容(AWS SigV4) · 预设: Amazon S3
配置
设置 → 图床 → + → Amazon S3。
| 字段 | 值 |
|---|---|
| Endpoint | 留空 —— Dropline 会自动用 https://s3.<region>.amazonaws.com |
| Region | 桶所在的 region,一字不差:us-east-1、eu-central-1、ap-northeast-1 |
| Bucket | 只填桶名,例如 my-assets |
| Access Key ID | IAM 用户的 AKIA… |
| Secret Access Key | 对应的密钥 —— 存进钥匙串 |
| 公开访问前缀 | 可选。有 CloudFront 的话填它的域名 |
| 对象键模板 | images/{{date}}/{{uuid}}.{{ext}} |
region 必须和桶一致。 AWS 会把 region 编进签名里校验,不一致的结果是 SignatureDoesNotMatch,而不是重定向。在 S3 控制台的桶列表里能看到。
创建存储桶
- S3 控制台 → 创建存储桶,起名字、选 region。
- 在 阻止公共访问里,如果你想让裸链接能在浏览器里打开,就取消勾选「阻止所有公共访问」。如果打算只走 CloudFront + OAC,那就保持开启。
- 创建。
一个最小权限的 IAM 用户
给 Dropline 一把只能写对象、别的什么都干不了的钥匙。IAM → 用户 → 创建用户,不给控制台访问权限,然后挂一条内联策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DroplineUpload",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::my-assets/images/*"
}
]
}
然后安全凭证 → 创建访问密钥 → 在 AWS 外部运行的应用程序。密钥只显示一次。
注意 Resource 的前缀和键模板是对齐的。改一个就要改另一个。
让对象可读
要让 https://…amazonaws.com/… 这样的裸链接能打开,对象必须可公开读取。常规做法是一条桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadImages",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-assets/images/*"
}
]
}
这只给这个前缀开放了读权限;写仍然需要 IAM 密钥。
你拿到的链接
公开访问前缀留空时,Dropline 返回它上传用的那个 path-style URL:
https://s3.eu-central-1.amazonaws.com/my-assets/images/2026/08/19/a1f3….png
能用,但很长,暴露了桶名,而且没有缓存。前面挂一个 CloudFront,把公开访问前缀设成分发的域名:
https://cdn.example.com
链接就变成:
https://cdn.example.com/images/2026/08/19/a1f3….png
Dropline 只用一个 / 把前缀和 key 接起来,不做别的处理。所以如果你的分发把桶挂在某个子路径下,前缀里要带上这个子路径。
CORS
只有浏览器用 JavaScript 去取这些文件时才需要 —— 普通的 <img> 标签不需要 CORS。确实需要的话:
[
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET"],
"AllowedOrigins": ["https://example.com"],
"MaxAgeSeconds": 3600
}
]
Dropline 本身是原生应用,完全不受 CORS 约束。
验证
点测试上传。成功后在浏览器里打开返回的 URL —— 这一步同时验证了写入路径和读取路径。如果上传成功但浏览器里 404,说明对象不是公开的,或者前缀不对,见疑难排查。
常见问题
| 现象 | 原因 |
|---|---|
SignatureDoesNotMatch |
region 和桶对不上,或者密钥里混进了空白字符 |
HTTP 403 但没提签名 |
IAM 策略没允许该前缀下的 s3:PutObject |
HTTP 404 |
桶名写错,或者它在另一个 region |
| 上传成功但链接 404 | 「阻止公共访问」还开着,或者没配桶策略 |