图片越积越多,放在自己服务器上既占带宽,页面也容易变慢。很多站长、电商运营和小程序开发者都会走到这一步,把图片迁到对象存储。阿里云上传图片的流程不复杂,先把存储空间和权限配好,再选一种上传方式就行。下面按实际操作顺序说。

先搞清楚三个名词
阿里云图片一般存在对象存储 OSS 里。上传前要认识三样东西:
- Bucket(存储空间):存放图片的容器,名称全局唯一。地域选定后基本不能改,所以创建前想清楚。
- Object(对象):每张图片就是一个对象,靠 Key(路径加文件名)来区分。商品图的 Key 最好按业务分层,比如 product/2024/xxx.jpg,后面好管理。
- Endpoint(访问域名):比如华东1(杭州)的公网地址是 oss-cn-hangzhou.aliyuncs.com。程序里调用时要填它,填错了会直接连不上。
地域一般选离主要用户近的。如果网站或应用也部署在阿里云同一地域,程序可以走内网域名上传,速度更快,通常也不计公网流量。
开始前的五项配置
- 进入控制台的对象存储 OSS 页面创建 Bucket。读写权限先选“私有”,等需要对外展示时,再用签名 URL 或 CDN 开放访问。
- 去 RAM 访问控制里给程序单独建一个 RAM 用户,只授予它需要的 OSS 读写权限。别直接拿主账号的 AccessKey 去跑程序,一旦泄露,整个账号都有风险。
- 为这个 RAM 用户生成 AccessKey ID 和 AccessKey Secret,存进环境变量或密钥管理服务。代码里硬编码的话,传到 Git 仓库后很快就会被扫到。
- 如果要让浏览器直接上传,在 Bucket 的跨域设置里加上你的网站域名,并允许 PUT、POST 方法。漏了这一步,浏览器控制台会报跨域错误,排查起来很烦。
- 根据用途设生命周期规则。比如临时上传目录里的文件 7 天后自动删除,避免废弃文件一直占着存储费用。
三种上传方式怎么选
三种方式都能把图片传上去,区别在于谁来操作、一次传多少。
控制台手动上传适合一次性的少量图片,比如设计师刚交付的首页 banner。进入 Bucket 的文件管理页面点上传就行,不用写代码。但如果每天要传几百张,靠手点很快就会成为瓶颈。
ossutil 命令行工具是阿里云官方的命令行工具,更适合运维同学批量同步目录。比如本地有 3000 多张商品图,用 ossutil 的 cp 命令加 -r 参数递归上传,一条命令就能跑完,而且支持断点续传。网络断了重新执行就行,不用从头来。
SDK 程序上传是最常见的集成方式,适合要和业务系统联动的场景,比如用户上传头像、后台自动把生成的海报存进 OSS。下面用 Python 的 oss2 SDK 给一个例子。
pip install oss2
import os
import oss2
# 凭证从环境变量读取,不写进代码
auth = oss2.Auth(os.environ[‘OSS_ACCESS_KEY_ID’], os.environ[‘OSS_ACCESS_KEY_SECRET’])
bucket = oss2.Bucket(auth, ‘https://oss-cn-hangzhou.aliyuncs.com’, ‘your-bucket-name’)
# 本地文件路径和云端 Key
local_path = ‘images/product-001.jpg’
object_key = ‘product/2024/product-001.jpg’
# 显式指定 Content-Type,否则浏览器可能把图片当成普通下载
headers = {‘Content-Type’: ‘image/jpeg’}
result = bucket.put_object_from_file(object_key, local_path, headers=headers)
print(‘HTTP状态码:’, result.status)
返回 200 就说明传成功了。把 your-bucket-name 换成你自己的存储空间名称,Endpoint 也要和 Bucket 所在地域对应。
大文件和用户上传要单独处理
单个文件超过 100MB 时,建议改用分片上传,SDK 里对应 resumable_upload 这类方法。分片之后,网络中断只需要补传失败的那几片,不用整个文件重来。
用户在网页或 App 里上传图片,千万别把 AccessKey 下发到客户端。常见做法有两种:一是后端签发 STS 临时凭证,二是生成带有效期的预签名 URL,客户端拿着它直接传到 OSS。比如某个社区论坛做头像上传,后端只签发 10 分钟有效的预签名地址,既不暴露密钥,也不用让自己的服务器中转大流量。
另外,上传前在服务端做一次校验。只允许 jpg、png、webp 这类图片格式,再限制单张大小,比如不超过 10MB。前端的校验可以被绕过,所以服务端这一关不能省。
传上去之后怎么访问
直接用 OSS 默认域名给用户看图,访问量一大就会吃压力,后续也不好统一管理。更常见的做法是绑定自定义域名并接入 CDN,让用户就近拿缓存。
阿里云还支持在图片 URL 后面追加处理参数,实时生成缩略图。比如把原图缩到 300 像素宽,就不用提前为每个尺寸存一份副本,省存储,也省后期维护。
有一家做家居用品的小型电商团队,把商品详情页里 2000 多张图迁到了 OSS,并接入 CDN 和缩略图参数。迁移后页面加载变快,服务器带宽费用也降了下来。他们的做法是先统一命名规则,再批量上传,最后才改前端的图片地址。顺序对了,中间几乎没出岔子。
阿里云上传图片这件事,真正费心的是前面的规划:存储空间怎么建、权限怎么分、密钥放哪里。方式选对了,上传本身很快。把这些先理顺,后面的访问加速和图片处理都会省心很多。