unicloud云函数不支持自动解析多文件,必须前端单文件单请求调用,或手动解析multipart/form-data;云函数内需校验、命名、返回fileid与url,严禁混用uploadfile接口。

uniCloud云函数里不能直接接收多文件数组
uniCloud云函数的uniCloud.uploadFile接口本身只支持单文件上传,它不解析 multipart/form-data 中的多个同名字段,也不会自动拆分files[]或file字段里的多个文件。如果你从前端一次性发来 5 个文件,云函数默认只拿到第一个(或报错解析失败),其余被丢弃。
常见错误现象:uploadFile:fail invalid file path(前端传参错)、TypeError: Cannot read property 'length' of undefined(云函数没取到event.files)、或后端只存了 1 张图却以为传了全部。
- 必须在前端按「单文件单请求」或「单请求带多个 base64 字段」方式组织数据,不能依赖后端自动拆包
- 云函数入口参数
event里没有files字段——这是 HTTP 协议层的事,uniCloud 不做自动解析;你要么手动解析event.body(需设Content-Type: application/json),要么用event.queryStringParameters传 base64(仅限小文件) - 大文件严禁走
queryStringParameters,会超长截断;必须用event.body+Content-Type: multipart/form-data,但此时需自己用formidable或busboy解析(阿里云函数支持,腾讯云需额外配置)
前端怎么传才能让云函数收到多个文件
两种可靠路径:一种是前端并发调用多次云函数(推荐),另一种是前端打包成一个请求、云函数手动解析(复杂且有兼容风险)。
生产环境强烈建议选第一种——即前端控制并发,每个uniCloud.callFunction只传 1 个文件。这样逻辑清晰、失败可定位、重试成本低。
- 不要把多个
fileContent塞进同一个event对象里传给云函数,云函数不会自动循环处理 - 前端调用时,每个请求的
data里只放一个fileBase64或fileUri(App/小程序端)或fileBlob(H5 端) - 如果用 base64,注意长度限制:阿里云函数 body 上限约 6MB,base64 膨胀约 33%,实际能传的原始文件不超过 ~4.5MB
- H5 端若用
File实例,需先转为 base64 或ArrayBuffer再传,不能直接传File对象(云函数收不到)
云函数里如何安全处理单次上传请求
每个云函数实例只负责一个文件,重点是校验、命名、防覆盖、返回结构统一。
别省略try/catch,也别硬编码cloudPath扩展名——图片类型可能混着 PDF、MP4,得从 base64 头或fileName推断。
-
cloudPath必须带扩展名,否则阿里云无法识别 MIME 类型,CDN 回源可能失败;可用mime.getType(fileName)或正则匹配 base64 头(如/^data:image\/(png|jpg|jpeg);base64,/) - 用
uniCloud.uploadFile时,fileContent必须是Buffer(Node.js)或Uint8Array(腾讯云),不能是字符串(除非明确是 base64 且加encoding: 'base64') - 上传成功后,务必返回
{ fileID, url, fileName },不要只返fileID——前端需要展示原文件名和可访问链接 - 失败时用
throw new Error('xxx'),不要只return { err: 'xxx' },否则uniCloud.callFunction的fail回调不会触发
并发太多会触发云函数冷启动或配额超限
uniCloud 对单个云函数调用有并发数限制(阿里云默认 100 QPS,但单 IP 限流更严),盲目让前端并发 20 次调用,大概率出现502 Bad Gateway或429 Too Many Requests。
这不是代码写错了,是平台行为。必须在前端做轻量队列,而不是靠云函数扛压。
- 前端并发数建议设为 3–5,用
p-limit或简单for...of + await控制,避免Promise.all整批失败 - 每个上传任务加唯一
id(如upload-${Date.now()}-${index}),便于前端 UI 显示「第3张上传失败」而非「上传失败」 - 云函数内部不做并发上传(比如一个函数里再调多次
uniCloud.uploadFile),会加剧冷启动和超时风险 - 上传完成状态必须显式维护在前端 data 里,不能只靠 success 回调更新;complete 回调要清 loading、重置按钮状态
req.file都没有,全得你手动喂。











