内置云存储的上传方式有3种:
web界面:即在https://unicloud.dcloud.net.cn/ web控制台,点击云存储,通过web界面进行文件上传。该管理界面同时提供了资源浏览、删除等操作界面。 客户端API或组件上传:在前端js中编写uniCloud.uploadFile,或者使用uni ui的FilePicker组件 ,文件选择+上传均封装完毕。 云函数上传文件到云存储:即在云函数js中编写uniCloud.uploadFile注意:
前端和云函数端,均有一个相同名称的api:uniCloud.uploadFile。请不要混淆。 前端还有一个uni.uploadFile的API,那个API用于连接非uniCloud的上传使用。请不要混淆。 在使用腾讯云时如果访问云存储文件提示The requested URL '/1123.jpg' was not found on this server这种错误,一般是cdn流量用尽导致的,可以升级套餐或转为按量计费。 在允许用户上传图片的应用里,违规检测是必不可少的,为此uniCloud提供了内容安全检测模块,可以很方便的实现图片鉴黄等功能。详情参考:内容安全 # 文件权限uniCloud阿里云版的云存储,不支持对文件设置读权限,任意人知道路径都可以读取。腾讯云、支付宝云则没有上述限制。
腾讯云
uniCloud腾讯云版支持云存储的文件权限。当上传的文件不希望被其他人访问时(比如身份证照片),需配置权限:
登录uniCloud web控制台 ,选择腾讯云服务空间,配置云存储的权限。如果是隐私文件,应该配置为仅云函数可读写。 在云函数中,通过uniCloud.getTempFileURL(见下),获取该文件的临时URL。然后将临时URL发给客户端,客户端根据临时URL请求云存储的文件。支付宝云
uniCloud支付宝云版支持云存储的文件夹权限,可以通过创建私有权限的文件夹,来保证改文件夹下的所有文件无法被公开读取,而必须通过uniCloud.getTempFileURL获取的临时URL来进行访问。
扩展存储扩展存储支持文件级别的公有、私有权限设置,详见updateFileStatus
# 目录支持支付宝云和腾讯云支持以上传时指定的cloudPath作为文件路径进行文件存储。
阿里云在HBuilderX 3.8.5及之后版本支持以上传时指定的cloudPath作为文件路径进行文件存储,需要在上传时指定参数cloudPathAsRealPath: true来启用目录支持。为兼容旧版阿里云表现cloudPathAsRealPath默认为false。对于客户端和本地云函数此调整在HBuilderX 3.8.5及之后的版本生效,对于云端云函数此调整自2023年6月17日生效。
阿里云在cloudPathAsRealPath为false时传的文件都存储在cloudstorage目录下,2023年6月17日起访问uniCloud web控制台云存储页面可以看到目录结构。需要注意cloudPathAsRealPath为true时,云函数使用同样的cloudPath上传文件会覆盖旧文件,客户端使用同样的cloudPath则会报policy_does_not_allow_file_overwrite。
阿里云文件列表在控制台支持两种模式:
文件夹模式:该模式下支持新建及上传指定文件到文件夹,列表按照名称正序排序。 文件列表模式:该模式是阿里云未支持文件夹之前的列表模式,所有文件平铺展示,列表按照更新时间倒序排序。开发者可结合两种模式来上传及查看文件。
# 客户端API在uni-app前端进行云存储的操作(不是在云函数里操作),包括在前端上传、删除文件。
腾讯云支持配置云存储权限,需搭配腾讯云自定义登录使用,详情:自定义登录
支付宝云与阿里云不支持控制前端访问云储存的权限
云存储客户端api内部会使用uni.request、uni.uploadFile来发送请求,如果有这两个接口写拦截器务必准确区分要拦截的内容
# uploadFile(Object object)直接上传文件到云存储。
客户端上传文件到云函数、云函数再上传文件到云存储,这样的过程会导致文件流量带宽耗费较大。所以一般上传文件都是客户端直传。
支付宝云、阿里云、腾讯云的单文件大小限制为5GB
支付宝小程序开发工具上传文件到腾讯云时可能会返回失败,请以真机为准
各个小程序平台运行时,网络相关的 API 在使用前需要配置域名白名单。参考
已知问题
HBuilderX 3.98之前的版本,微信小程序端上传文件到支付宝云会报错 非web端、微信小程序端上传文件到支付宝云会出现怪异表现或者报错,例如:百度小程序会既不触发失败也不触发成功,最终会上传一个空文件上去。此问题支付宝云已在2023年11月21日修复。 # 请求参数Object object
参数名 类型 必填 默认值 说明 平台差异说明 filePath String 是 - 要上传的文件对象 - cloudPath String 是 - 使用支付宝云或腾讯云时,表示文件的绝对路径,包含文件名。使用阿里云时,cloudPath为云端文件名,传cloudPathAsRealPath: true可以让cloudPath作为文件存储路径 - cloudPathAsRealPath Boolean 否 false 是否以cloudPath作为云端文件绝对路径 仅阿里云支持 fileType String - - 文件类型,支付宝小程序、钉钉小程序必填,可选image、video、audio - onUploadProgress Function 否 - 上传进度回调 -注意
使用阿里云时,cloudPath为云端文件名,请勿使用非法字符 支付宝云与腾讯云cloudPath 为文件的绝对路径,包含文件名 foo/bar.jpg、foo/bar/baz.jpg 等,不能包含除[0-9 , a-z , A-Z]、/、!、-、_、.、、*和中文以外的字符,使用 / 字符来实现类似传统文件系统的层级结构。 支付宝云与腾讯云cloudPath为文件标识,相同的cloudPath会覆盖,如果没有权限覆盖则会上传失败。阿里云以自动生成的ID为文件标识,不会存在覆盖问题 阿里云目前由于安全原因暂时禁止云存储内上传html文件 上传文件超时时间可以在项目manifest.json内进行配置关于腾讯云是否有权限覆盖/删除云端文件
腾讯云使用自定义登录的方式确定用户身份。以下以默认权限”所有用户可读,仅创建者及管理员可写“为例进行讲解
默认情况下用户以匿名身份登录(为了方便暂时称此身份为“匿名用户A”)
云端路径不存在则可以成功上传。 云端路径存在并且是匿名用户A创建的可以成功上传 云端路径存在并且并非匿名用户A创建的会上传失败匿名用户A身份过期之后再次获取的身份并不是”匿名用户A“(暂记为”匿名用户B“),这时匿名用户B是没有权限覆盖匿名用户A上传的文件的。
如果使用了自定义登录,那么云存储就可以确定用户身份,这时候用户可以覆盖自己上传的文件,删除同理。
# 响应参数 字段 类型 说明 fileID String 文件唯一 ID,用来访问文件,建议存储起来 requestId String 请求序列号,用于错误排查 # 示例代码 //前端代码uni.chooseImage({ count: 1, success(res) {console.log(res);if (res.tempFilePaths.length > 0) { let filePath = res.tempFilePaths[0] //进行上传操作 // promise方式 const result = await uniCloud.uploadFile({filePath: filePath,cloudPath: 'a.jpg',onUploadProgress: function(progressEvent) { console.log(progressEvent); var percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total );} }); // callback方式,与promise方式二选一即可 uniCloud.uploadFile({filePath: filePath,cloudPath: 'a.jpg',onUploadProgress: function(progressEvent) { console.log(progressEvent); var percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total );},success() {},fail() {},complete() {} });} }});Tips
阿里云返回的fileID为