根本原因是云服务空间未配置web安全域名白名单——h5上线后因跨域被浏览器拦截,而本地调试因hbuilderx代理绕过cors;需在云控制台“安全配置”中正确填写https域名(不含路径),且修改后需清dns缓存并硬刷新。

uni-app在H5端调用uniCloud.uploadFile上传文件到云存储时出现跨域错误,根本原因不是代码写错了,而是服务空间没配白名单——部署后前端域名和云存储域名(如unicloud.dcloud.net.cn)不同源,浏览器直接拦截响应头。
为什么H5本地调试不报错,一上线就403或CORS error
因为HBuilderX内置浏览器做了代理绕过同源策略,而真实H5环境走的是标准CORS流程。你看到的OPTIONS 403或Access-Control-Allow-Origin is not allowed,90%都卡在服务空间的Web安全域名配置上。
- 免费版空间必须通过HBuilderX右键→“打开云控制台”进入,不能直接进dcloud官网控制台(权限不一致)
- 阿里云/腾讯云版空间里,“Web安全域名”配置项藏在「安全配置」二级菜单下,不是首页显眼位置
- 填域名时不能带路径,只允许
https://yourdomain.com或https://api.yourdomain.com,https://yourdomain.com/h5会失效 - 测试阶段慎用
*,DCloud已明确限制通配符仅对localhost和127.0.0.1生效,线上填*等于没填
uniCloud.uploadFile在H5与小程序平台的参数差异
同一个API,H5和小程序传参方式完全不同,混用会导致file not found或invalid file path错误。
- H5端必须传
filePath为File对象(比如event.target.files[0]),不能传字符串路径 - 微信小程序端
filePath必须是tempFilePath字符串,来自uni.chooseImage或uni.chooseMedia返回值 - App端支持
filePath为本地绝对路径或ArrayBuffer,但iOS沙盒路径需用uni.getFileSystemManager().readFile先转成buffer - 所有平台都必须设
cloudPath,且不能含非法字符(空格、中文、特殊符号),建议用Date.now() + '-' + Math.random().toString(36).slice(2)生成
云函数中调用uniCloud.uploadFile反而不会跨域?
对,云函数运行在服务端,不受浏览器CORS限制。但要注意:这是“服务端上传”,不是前端直传。常见误用是前端把文件二进制发给云函数,再由云函数上传——这既浪费带宽又延长耗时,还可能触发云函数10MB请求体限制。
- 正确做法是前端直传(
uniCloud.uploadFile),云函数只做后续处理(如存DB、触发鉴黄) - 若必须服务端上传(例如要加签名、改元数据),请用
uniCloud.uploadFile的clientIP参数校验来源,避免被恶意调用 - 云函数内调用
uniCloud.uploadFile时,filePath只能是云函数临时目录里的路径(如/tmp/xxx.jpg),不能是HTTP URL
最容易被忽略的一点:跨域配置生效有缓存,修改Web安全域名后,必须清空浏览器DNS缓存(chrome://net-internals/#dns)并硬刷新页面,否则仍会沿用旧策略。另外,如果用了CDN或反向代理,还要确认中间层没覆盖或删除Access-Control-Allow-Origin响应头。











