uni.uploadFile直传必须使用后端签发的临时凭证(AccessKeyId、SecurityToken、AccessKeySecret)及配套policy和signature,禁用永久密钥;policy为Base64编码JSON,含有效期等规则;signature须用AccessKeySecret对policy做HMAC-SHA1再Base64;三端均需传x-oss-security-token;跨域需配置CORS(H5)、合法域名(小程序)、usesCleartextTraffic(App);视频上传需适配tempFilePath路径差异;大文件应走分片上传;STS接口必须由后端提供,前端不得硬编码密钥。

uni.uploadFile 直传必须带 signature 和 policy,不能只填 AccessKey
前端直传不是把永久密钥塞进去就完事——阿里云 OSS 明确拒绝这种用法,会直接返回 403 Forbidden 或 InvalidAccessKeyId。真正起作用的是后端签发的临时凭证 + 策略签名组合。
-
policy是一段 Base64 编码的 JSON,定义了上传有效期、文件大小限制、路径前缀等规则,过期时间一般设为 1 小时(expiration字段) -
signature必须用AccessKeySecret对policy做 HMAC-SHA1 计算,再 Base64 编码;错一位、少一个空格、时间格式不对(必须 ISO 8601 带 Z 或时区)都会报SignatureDoesNotMatch - 小程序/H5/App 三端都要求传
x-oss-security-token字段(哪怕 App 端不显式需要,也建议统一带上),否则 H5 可能成功、小程序却失败
跨域和域名白名单是“上传卡住没反应”的头号原因
很多开发者看到 uni.uploadFile 没回调、控制台也没报错,其实是请求被浏览器或小程序拦截了——根本没发出去。
- H5 端:检查 OSS Bucket 的 CORS 配置,
AllowedOrigin不能只写http://localhost:8080,开发时建议先设为*,上线再收窄;AllowedMethod必须含PUT(直传走的是 PUT 请求,不是 POST) - 微信小程序:在公众平台「开发管理 → 开发者工具 → request 合法域名」里加 OSS endpoint,比如
https://your-bucket.oss-cn-shanghai.aliyuncs.com,漏掉这个,连 OPTIONS 预检都通不过 - App 端(Android/iOS):不需要配域名白名单,但需确认
manifest.json中app-plus下的usesCleartextTraffic为true(仅调试期),且 endpoint 必须是 HTTPS
视频上传要特别注意 tempFilePath 转换和分片逻辑
uni-app 的 uni.chooseVideo 返回的 tempFilePath 在不同平台指向不同路径:H5 是 blob URL,App 是本地沙盒路径,小程序是临时文件路径——直接丢给 uni.uploadFile 会报 file not found。
- App 端必须用
plus.io.convertLocalFileSystemURL()转成绝对路径,例如:plus.io.convertLocalFileSystemURL(res.tempFilePath) - 小程序/H5 不需要转换,但 H5 的 blob URL 无法用于直传,得先用
fetch+ArrayBuffer转成二进制再上传(此时建议改用插件或后端中转) - 大视频(>100MB)别硬扛单次上传:OSS 原生支持分片上传,但
uni.uploadFile不支持;必须用原生插件(如MZ-AliyunOss)或自己封装 multipart upload 逻辑
STS 临时凭证接口必须由后端提供,前端绝不存 AccessKeySecret
网上有些“纯前端直传”教程教你在 JS 里写死密钥,这是严重安全漏洞——任何用户打开 DevTools 都能扒出你的主账号密钥,OSS 桶可能一夜之间被刷爆。
- 后端应调用阿里云 STS SDK(如
@alicloud/pop-core),生成带权限策略的临时 token,有效期严格控制在 15–30 分钟 - 前端只接收
AccessKeyId、SecurityToken、AccessKeySecret(仅用于本次签名计算,内存中不留痕),且每次上传前都应重新拉一次 token - 如果后端不愿暴露 STS 接口,至少用服务端签名模式:前端传文件哈希/大小给后端,后端返回
policy+signature,避免密钥落地
真正麻烦的从来不是怎么写那几行 upload 代码,而是让签名不过期、跨域不拦截、路径不乱码、密钥不泄露——这些点串起来,才是上线前最后一道坎。

















