1. 为什么对象存储成了项目标配
做开发这些年,接触过不少存储方案。早年间项目里存文件,最常用的手段就是搞一台服务器,开个 Nginx,把图片往磁盘目录里一扔,对外暴露一个静态路径,完事。这种方案在数据量小、并发低的时候确实够用,但随着业务起来,问题会一个个冒出来:磁盘满了要手动清理、服务器挂了图片全丢、多台机器之间文件无法同步、备份恢复全靠 shell 脚本硬扛。
后来接触到对象存储(OSS,Object Storage Service),算是彻底把我从这些破事里解放出来了。这东西本质上就是一个海量的、扁平的“文件仓库”,你不需要关心文件存在哪块磁盘、哪台机器上,只需要关心三个东西:桶(Bucket)、对象(Object)、Key(对象的名字)。你可以把 OSS 想象成一个巨大的网盘,但它不是给人手动用的,而是给程序通过 API 来存取数据的,容量近乎无限、自带多副本冗余、天然支持 CDN 回源加速,按量付费,用多少花多少。
不管是用阿里云 OSS、腾讯云 COS,还是开源的 MinIO 自建一套,核心思路都是一样的。这篇文章我不打算写成官方文档的复读机,而是想结合我实际用下来的经验,把对象存储从概念到落地、再到常见坑的排查,整个串一遍。尤其会聊到几个经常在项目里遇到的场景,比如 FastAdmin 怎么把上传文件改到阿里云 OSS、Windchill 这种 PLM 系统里改前改后对象怎么存、以及开源软件合规扫描之后那一堆报告怎么归档管理。
如果你正在纠结“我要不要上 OSS”,或者已经上了但总遇到权限、跨域、大文件超时之类的问题,这篇文章应该能帮上忙。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 上手 OSS 之前,先把这几个核心概念吃透
2.1 桶、对象、Key:三个名词理解一切
对象存储的模型非常简单,一共就两层:最外层是桶,桶里面装着一个个对象。对象就是你要存的任意文件,一张图片、一个视频、一份 PDF、一个数据库备份压缩包,都可以作为一个对象;Key 就是对象在桶里的唯一名字,类似文件路径,但它不是真实的目录层级,只是看起来像路径而已。
举个例子,我存一张用户头像,Key 可以设为 avatar/user_10001.jpg,在 OSS 控制台里它看起来就像放在了 avatar 目录下,实际上这就是一个平铺的 KV 结构,avatar/user_10001.jpg 只是字符串。这个设计带来的好处是:你可以在 Key 里加任意前缀,用来做业务隔离,而不需要真的去创建目录、维护层级关系。
桶的命名规则各个云厂商略有差异,一般要求全局唯一,因为桶名会直接出现在访问域名里,比如 my-bucket.oss-cn-hangzhou.aliyuncs.com 这种。创建桶的时候,有几个重要参数要提前想清楚:
- 地域(Region):桶在哪个物理区域,决定了你的访问延迟和费用。面向国内用户就选华东、华北这些大区,面向海外就选对应区域的节点。地域一旦创建,迁移成本很高,建议按业务主要受众来定。
- 读写权限:私有、公共读、公共读写。这个后面细说。
- 版本控制:开启后,对象被覆盖或删除时,历史版本会被保留,这对数据安全很有帮助。
2.2 访问域名和 Endpoint:连接 OSS 的钥匙
Endpoint 可能是新手最先接触、也最容易搞混的概念。它其实就是 OSS 服务的 API 入口地址,不同地域的 Endpoint 不一样,比如华东 1(杭州)的 Endpoint 是 oss-cn-hangzhou.aliyuncs.com,而外网访问桶里的对象时用的域名又是 bucket-name.oss-cn-hangzhou.aliyuncs.com。
这里有个小坑:Endpoint 分为内网和公网两种。如果你的 ECS 服务器和 OSS 在同一个地域,一定要用内网 Endpoint 访问,因为它不走公网流量,速度更快,而且不产生流量费用。我之前就见过有人把 ECS 上的应用配成公网 Endpoint,结果每月账单里流量费高得离谱,后来改成内网地址,费用直接降了一个量级。
另外,如果你绑定了自定义域名,还要注意访问 OSS 时走的到底是默认域名还是自定义域名。很多云厂商对自定义域名访问有特殊要求,比如必须备案、需要开启 CDN 加速等,配置前建议先看清楚官方限制。
2.3 权限模型:读、写、管理要分开
对 OSS 权限的理解不能停留在“公共读还是私有”这种粗粒度上。实际的项目里,我一般按这样的思路来划分:
- 桶级别的权限:比如头像、商品图这类公开资源,桶设置为
