做网站、小程序或内部系统时,文件上云往往是最先碰到的问题。图片、视频、安装包、报表一多,既要传得快,又要传得稳,还不能出安全问题。对象存储 OSS 是阿里云上处理这类需求最常用的服务。下面按场景讲三种上传方式:控制台、命令行和代码。最后说前端直传和安全设置。

先定好文件怎么用
上传之前,先想清楚三件事:文件是什么类型,谁来访问,访问频率高不高。这三点决定了用哪种上传方式,也决定 Bucket(存储空间)的读写权限怎么设。
- 公开资源,比如商城的商品主图、官网的宣传图。一般设为公共读,再接 CDN 加速。
- 私有文件,比如合同扫描件、用户身份材料。保持私有读写,访问时发带签名的临时链接。
- 大文件,比如几百兆的视频或数据库备份。要用分片上传,否则网络一抖就得整个文件重传。
控制台上传:文件不多时最省事
运营偶尔传几张图,或者技术人员临时放一个配置包,用控制台就够了。登录阿里云,进入对象存储 OSS 管理页面,选中目标 Bucket,点“文件管理”,再点“上传文件”。
某本地餐饮连锁品牌的市场专员,每周要更新二十多家门店的活动海报。她不写代码,直接在控制台批量拖拽上传,目录按“年份/门店编号/活动名”命名。门槛低,但文件一多就容易放错位置,而且没法和业务系统联动。
ossutil 命令行:适合批量和定时任务
文件数量到了成百上千,或者需要定时同步日志、备份数据,就该用 ossutil。它是阿里云官方的命令行客户端,支持递归上传、断点续传和并发控制。
先执行 ossutil config,填入访问凭证和地域节点。上传时用 ossutil cp,加上 -r 参数就能递归上传整个目录。比如把本地的 ./backup 目录传到某个 Bucket 的 daily 路径下,一条命令即可完成。
一家中型在线教育公司每天凌晨要把当天生成的课程录播同步到 OSS。运维把 ossutil 命令写进定时任务,配合日志记录,做到无人值守。上线第一个月,因网络抖动失败的任务都靠断点续传自动恢复,不用人工排查。
代码上传:嵌入业务流程
如果上传要融进业务,比如用户在网页上传头像后自动生成缩略图,就该用官方 SDK。阿里云为 Java、Python、Go、Node.js 等主流语言都提供了 SDK。
以 Python 为例,装好 oss2 库后,主要分三步:
- 用 AccessKey ID 和 AccessKey Secret 创建 Auth 对象。
- 用地域对应的 Endpoint 和 Bucket 名称创建 Bucket 对象。
- 调用 put_object,传入对象名(也就是文件在云端的路径)和本地文件内容。
超过 100 MB 的文件建议走分片上传。SDK 把文件切成若干分片并行传输,最后合并。分片大小可以按网络条件调整,常见设置是 4 MB 到 16 MB。中途失败时,只需重传失败的那几个分片。
案例:短视频工具的分片改造
某短视频创作工具的开发团队,最初用普通上传接口传用户视频。弱网环境下,成功率不到六成。后来他们改成分片上传,并记录每个分片的状态。用户断网后重新打开应用,就能从断点继续。同样的网络环境下,成功率提升到接近百分之九十八。上传方式对体验影响很大,只保证“能传上去”远远不够。
前端直传:别让服务器中转
不少项目让用户先传到自己的服务器,再由服务器转存到 OSS。这多出一道中转,占带宽,也拖累服务器的内存和磁盘。更稳的做法是用预签名 URL 或 STS 临时授权,让浏览器或手机端直接把文件传给 OSS。
流程通常是:客户端请求业务服务器,服务器校验用户身份和文件类型,再生成一个有效期较短的预签名地址返回。前端拿这个地址直接上传。AccessKey 始终留在服务端,不会下发到客户端。
安全和成本一起管
权限和费用都要管,漏掉哪一项都可能出事。
- AccessKey 不要写进前端代码或公开仓库。泄露后,别人可能借你的账号产生高额费用。
- 按最小权限分配。给上传程序单独建子账号或 RAM 角色,只授予目标 Bucket 的写入权限。
- 限制文件类型和大小。服务端校验后缀名、文件头和大小,挡住恶意文件和误传的超大文件。
- 给临时文件设置生命周期规则。到期自动删除,免得长期占着存储空间。
- 重要文件开启版本控制或防覆盖。误覆盖后还能找回旧版本。
怎么选
偶尔手动传,用控制台。定期批量同步,ossutil 性价比高。上传是业务功能的一部分,就用 SDK 加前端直传,并做好分片和重试。方案没有绝对的好坏,要看文件规模、网络环境和团队的技术能力。
建议先用一小批文件跑通流程,再逐步放大规模。权限、稳定性和成本一起考虑,比一开始就追求大规模上线更稳。