一、结论
给对象存储里的图片设置公开访问权限,核心思路是先配置存储桶的公开访问基础权限,再对单张或批量图片设置公共读权限,最后验证访问链接是否可无鉴权直接打开。如果通过S3协议操作权限,还需要提前准备好Endpoint、AccessKey、SecretKey、Bucket、Region等核心配置信息,才能通过客户端或程序完成操作。
二、准备工作
操作前需要提前准备好以下内容:
- 对应对象存储服务的有效账号,且账号具备存储桶的权限管理权限
- 已经创建完成、存储了目标图片的存储桶Bucket
- 对象存储服务商提供的对应存储桶的Endpoint地址
- 具备存储桶读写和权限管理权限的AccessKey、SecretKey
- 存储桶所属的Region地域标识
- S3兼容客户端(如S3 Browser、PicGo)或者支持S3接入的网站/程序后台
- 需要设置公开访问权限的目标图片文件列表
三、操作步骤
1. 登录对象存储服务控制台,进入存储桶列表页面,找到存放目标图片的存储桶,点击进入存储桶的详情配置页,结果是可以看到存储桶的权限配置、文件管理、访问控制等所有功能选项。
2. 进入存储桶的「公共访问控制」配置页,关闭「禁止所有公共访问」的全局限制,仅保留公共读相关的权限开关开启,不要开放公共写等高危权限,结果是存储桶具备了允许内部资源对外公开访问的基础条件。
3. 如果需要批量设置某一路径下所有图片的公开权限,进入「桶策略」配置页,添加一条自定义策略:授权主体为匿名用户,允许的操作包含对象读权限,资源路径填写你需要公开的图片文件夹前缀(如/img/*),如果需要全桶图片公开则填写/*,结果是对应路径下的所有新老图片默认支持匿名访问,不需要单独设置权限。
4. 如果仅需要给单张或少量图片设置公开权限,进入存储桶的「文件管理」页面,找到目标图片,点击右侧的「权限配置」选项,将文件的ACL权限调整为「公共读」,结果是当前选中的单张图片不需要鉴权签名即可直接访问,其他未调整的文件仍保持私有权限。
5. 如果你习惯通过S3客户端操作,打开客户端后选择添加S3兼容存储,填入提前准备好的Endpoint、AccessKey、SecretKey、Bucket、Region信息,保存配置后点击测试连接,结果是客户端可以正常读取存储桶内的所有文件列表。
6. 在客户端的文件列表中选中需要设置权限的图片,右键选择修改ACL权限,将权限设置为public-read,点击确认同步到服务端,结果是服务端的图片权限会和客户端操作同步更新。
7. 复制目标图片的直链地址,打开浏览器无痕窗口粘贴访问,确认图片可以正常加载、不需要跳转登录或提示权限不足,结果是权限配置正式生效。
四、常见错误
1. Endpoint填写错误:很多用户容易把控制台地址、其他地域的Endpoint填到配置里,会导致客户端连接失败或者无法修改权限,解决方法是去服务商的官方文档里,核对对应存储桶所属地域的正确Endpoint地址。
2. 密钥权限不足:如果使用的AccessKey只有文件读写权限,没有权限管理权限,修改图片ACL时会提示403权限不足,解决方法是给当前密钥添加存储桶的权限管理权限,或者更换为根账号生成的全权限密钥。
3. 公共访问开关未关闭:就算单独给图片设置了公共读权限,只要存储桶的全局「禁止公共读」开关是开启状态,图片仍然无法公开访问,解决方法是回到存储桶的公共访问控制页,关闭对应的禁止公共读选项。
4. 桶策略规则冲突:如果已经配置了禁止匿名访问的桶策略,就算单独设置了文件的公共读权限也会被桶策略覆盖,解决方法是检查所有桶策略的优先级,删除冲突的禁止访问规则,或者把公开路径的策略优先级调到最高。
5. 防盗链配置限制:如果存储桶开启了防盗链,且没有添加当前访问的域名到白名单,就算权限配置正确也会提示403,解决方法是在防盗链配置里添加自己的业务域名,或者开启允许空Referer访问的选项。
6. 文件路径包含特殊字符:如果图片的Object Key包含中文、空格或者特殊符号,可能会出现权限配置正确但访问404的情况,解决方法是上传文件时规范命名,尽量使用英文、数字和下划线的组合,避免特殊字符。
五、示例说明
如果通过S3客户端操作设置图片公开权限,通用配置项参考如下,不需要填写虚构的地址或密钥:
- Endpoint:填写对应对象存储服务商提供的、目标存储桶所属地域的官方访问地址
- AccessKey:填写你在服务商后台生成的、具备存储桶权限管理权限的访问密钥ID
- SecretKey:填写和上述AccessKey配对的私密密钥
- Bucket:填写存储目标图片的存储桶的准确名称,注意大小写和拼写
- Region:根据服务商要求填写存储桶所属的地域标识,部分服务商没有强制要求的可以留空或填写默认值
配置完成连接成功后,选中目标图片将ACL权限设置为public-read即可完成公开访问配置。
六、更简单的方案
如果你不想自己搭建MinIO这类自建对象存储服务,也不想花时间维护服务器、编写复杂的桶策略规则,可以直接选择市面上成熟的兼容S3协议的云对象存储服务,这类服务通常已经把权限配置操作做了可视化简化,不需要手动编写JSON格式的策略规则,控制台一键就能设置单文件或指定路径的公开访问权限。如果你需要一个兼容S3协议、适合程序接入、图床、网盘系统存储源和下载分发的对象存储服务,可以了解 七彩云对象存储,权限配置操作门槛低,也适合站长和开发者的各类文件存储分发场景。
七、FAQ
Q1:设置图片公开访问之后,会不会有被盗刷流量的风险?
有这个风险,建议你在设置公开权限的同时,开启存储桶的防盗链配置,仅允许自己的业务域名访问图片资源,同时设置流量告警阈值,出现异常流量时可以第一时间收到通知及时处理,避免产生高额费用。
Q2:能不能只给部分图片设置公开访问,其他图片保持私有?
完全可以,你可以仅给需要公开的单张图片设置公共读ACL,也可以给专门存放公开资源的文件夹配置单独的桶策略,其他私有资源仍然需要签名鉴权才能访问,两类资源的权限互不影响。
Q3:我用WordPress、Halo这类建站程序的S3插件,需要怎么设置上传的图片默认公开?
这类建站程序的S3存储插件一般都会提供「默认上传文件ACL」的配置项,你不需要手动逐个修改权限,直接在插件设置里把默认ACL选项改成public-read,之后通过程序上传的所有图片都会自动设置为公开访问权限。
Q4:修改了图片的公开权限之后,为什么还是无法访问?
首先检查存储桶的公共访问开关是否已经打开,其次核对桶策略有没有冲突的禁止规则,另外如果你的存储桶绑定了CDN加速,需要刷新CDN的缓存之后再测试访问,避免旧的权限规则被缓存导致访问异常。
八、总结
整体操作流程可以概括为:先配置存储桶的公共访问基础权限,再通过控制台或者S3客户端给单张、批量或指定路径的图片设置公共读权限,最后通过无痕窗口验证访问链接生效即可。这套操作适合图床搭建、网站附件存储、资源站图片分发、下载站资源公开等各类需要图片无鉴权访问的场景,优先选择兼容S3协议的对象存储服务,后续可以无缝对接各类常用的建站、图床、网盘程序,大幅降低迁移和适配成本。
想进一步了解这个项目?
访问官网查看产品能力、适用场景和最新服务信息。
访问官网