跳至主要內容

09 【云存储】

约 2552 字大约 9 分钟...

09 【云存储】

1.概述

云存储的上传方式有3种:

  1. web界面:即在https://unicloud.dcloud.net.cn/ (opens new window)open in new windowweb控制台,点击云存储,通过web界面进行文件上传。该管理界面同时提供了资源浏览、删除等操作界面。
  2. 客户端API或组件上传:在前端js中编写uniCloud.uploadFile,或者使用uni ui的FilePicker组件 (opens new window)open in new window,文件选择+上传均封装完毕。
  3. 云函数上传文件到云存储:即在云函数js中编写uniCloud.uploadFile

注意:

  • 前端和云函数端,均有一个相同名称的api:uniCloud.uploadFile。请不要混淆。
  • 前端还有一个uni.uploadFile的API,那个API用于连接非uniCloud的上传使用。请不要混淆。
  • 在使用腾讯云时如果访问云存储文件提示The requested URL '/1123.jpg' was not found on this server这种错误,一般是cdn流量用尽导致的。可以升级配置或转为按量计费(目前仅企业类型认证的账号可以使用按量计费的服务空间)。
  • 在允许用户上传图片的应用里,违规检测是必不可少的,为此uniCloud提供了内容安全检测模块,可以很方便的实现图片鉴黄等功能。详情参考:内容安全open in new window

2.uni-file-picker上传文件

uni-app官网 (dcloud.net.cn)open in new window

文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间

注意事项

为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。

  • 组件需要依赖 sass 插件 ,请自行手动安装
  • 如不绑定服务空间,autoUpload默认为false且不可更改
  • 选择文件目前只支持 H5微信小程序平台 ,且 微信小程序平台 使用 wx.chooseMessageFile()
  • v-model 值需要自动上传成功后才会绑定值,一般只用来回显数据

2.1 基础用法

<uni-file-picker 
	v-model="imageValue" 
	fileMediatype="image" 
	mode="grid" 
	@select="select" 
	@progress="progress" 
	@success="success" 
	@fail="fail" 
/>
<script>
	export default {
		data() {
			return {
				imageValue:[]
			}
		},
		methods:{
			// 获取上传状态
			select(e){
				console.log('选择文件:',e)
			},
			// 获取上传进度
			progress(e){
				console.log('上传进度:',e)
			},
			
			// 上传成功
			success(e){
				console.log('上传成功')
			},
			
			// 上传失败
			fail(e){
				console.log('上传失败:',e)
			}
		}
	}
</script>

2.2 选择指定后缀图片,且限制选择个数

配置 file-mediatype 属性为 image,限定只选择图片

配置 file-extname 属性为 'png,jpg',限定只选择 pngjpg后缀的图片

配置 limit 属性为 1 ,则最多选择一张图片

<uni-file-picker 
	v-model="imageValue"  
	file-mediatype="image"
	mode="grid"
	file-extname="png,jpg"
	:limit="1"
	@progress="progress" 
	@success="success" 
	@fail="fail" 
	@select="select"
/>

2.3 手动上传

配置 auto-upload 属性为 false ,可以停止自动上传,通过ref调用upload方法自行选择上传时机

<template>
	<view>
		<uni-file-picker  ref="files" :auto-upload="false"/>
		<button @click="upload">上传文件</button>
	</view>
</template>
<script>
	export default {
		data() {},
		methods:{
			upload(){
				this.$refs.files.upload()
			}
		}
	}
</script>

2.4 注意

v-model/value 格式

三个属性必填,否则影响组件显示

[
	{
		"name":"file.txt",
		"extname":"txt",
		"url":"https://xxxx",
		// ...
	}
]

3.手写上传

3.1 uni.chooseImage(OBJECT)

从本地相册选择图片或使用相机拍照。https://uniapp.dcloud.io/api/media/video?id=choosemediaopen in new window)

OBJECT 参数说明

参数名类型必填说明平台差异说明
countNumber最多可以选择的图片张数,默认9见下方说明
sizeTypeArray<String>original 原图,compressed 压缩图,默认二者都有App、微信小程序、支付宝小程序、百度小程序
extensionArray<String>根据文件拓展名过滤,每一项都不能是空字符串。默认不过滤。H5(HBuilder X2.9.9+)
successFunction成功则返回图片的本地文件路径列表 tempFilePaths
failFunction接口调用失败的回调函数小程序、App
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

注:文件的临时路径,在应用本次启动期间可以正常使用,如需持久保存,需在主动调用 uni.saveFileopen in new window,在应用下次启动时才能访问得到。

success 返回参数说明

参数类型说明
tempFilePathsArray<String>图片的本地文件路径列表
tempFilesArray<Object>Array<File>图片的本地文件列表,每一项是一个 File 对象

File 对象结构如下

参数类型说明
pathString本地文件路径
sizeNumber本地文件大小,单位:B
nameString包含扩展名的文件名称,仅H5支持
typeString文件类型,仅H5支持

示例

uni.chooseImage({
	count: 6, //默认9
	sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
	sourceType: ['album'], //从相册选择
	success: function (res) {
		console.log(JSON.stringify(res.tempFilePaths));
	}
});

3.2 uni.previewImage(OBJECT)

预览图片。

OBJECT 参数说明

OBJECT 参数说明

参数名类型必填说明平台差异说明
currentString/Number详见下方说明详见下方说明
urlsArray<String>需要预览的图片链接列表
indicatorString图片指示器样式,可取值:"default" - 底部圆点指示器; "number" - 顶部数字指示器; "none" - 不显示指示器。App
loopBoolean是否可循环预览,默认值为 falseApp
longPressActionsObject长按图片显示操作菜单,如不填默认为保存相册App 1.9.5+
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

current 参数说明

1.9.5+ 支持传图片在 urls 中的索引值

current 为当前显示图片的链接/索引值,不填或填写的值无效则为 urls 的第一张。App平台在 1.9.5至1.9.8之间,current为必填。不填会报错

注意,当 urls 中有重复的图片链接时:

  • 传链接,预览结果始终显示该链接在 urls 中第一次出现的位置。
  • 传索引值,在微信/百度/字节跳动小程序平台,会过滤掉传入的 urls 中该索引值之前与其对应图片链接重复的值。其它平台会保留原始的 urls 不会做去重处理。

举例说明:

一组图片 [A, B1, C, B2, D],其中 B1 与 B2 的图片链接是一样的。

  • 传 B2 的链接,预览的结果是 B1,前一张是 A,下一张是 C。
  • 传 B2 的索引值 3,预览的结果是 B2,前一张是 C,下一张是 D。此时在微信/百度/字节跳动小程序平台,最终传入的 urls 是 [A, C, B2, D],过滤掉了与 B2 重复的 B1。

longPressActions 参数说明

参数类型必填说明
itemListArray<String>按钮的文字数组
itemColorString按钮的文字颜色,字符串格式,默认为"#000000"
successFunction接口调用成功的回调函数,详见返回参数说明
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

success 返回参数说明

参数类型说明
indexNumber用户长按图片的索引值
tapIndexNumber用户点击按钮列表的索引值

示例

// 从相册选择6张图
uni.chooseImage({
	count: 6,
	sizeType: ['original', 'compressed'],
	sourceType: ['album'],
	success: function(res) {
		// 预览图片
		uni.previewImage({
			urls: res.tempFilePaths,
			longPressActions: {
				itemList: ['发送给朋友', '保存图片', '收藏'],
				success: function(data) {
					console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片');
				},
				fail: function(err) {
					console.log(err.errMsg);
				}
			}
		});
	}
	});

3.3 uni.getImageInfo(OBJECT)

获取图片信息。

小程序下获取网络图片信息需先配置download域名白名单才能生效。

OBJECT 参数说明

参数名类型必填说明
srcString图片的路径,可以是相对路径,临时文件路径,存储文件路径,网络图片路径
successFunction接口调用成功的回调函数
failFunction接口调用失败的回调函数
completeFunction接口调用结束的回调函数(调用成功、失败都会执行)

success 返回参数说明

参数名类型说明平台差异说明
widthNumber图片宽度,单位px
heightNumber图片高度,单位px
pathString返回图片的本地路径
orientationString返回图片的方向,有效值见下表App、小程序、京东小程序
typeString返回图片的格式App、小程序、京东小程序

示例

uni.chooseImage({
	count: 1,
	sourceType: ['album'],
	success: function (res) {
		uni.getImageInfo({
			src: res.tempFilePaths[0],
			success: function (image) {
				console.log(image.width);
				console.log(image.height);
			}
		});
	}
});

3.4 uploadFile(Object object)

直接上传文件到云存储。

客户端上传文件到云函数、云函数再上传文件到云存储,这样的过程会导致文件流量带宽耗费较大。所以一般上传文件都是客户端直传。

阿里云单文件大小限制为100M,腾讯云单文件最大为5G

各个小程序平台运行时,网络相关的 API 在使用前需要配置域名白名单。open in new window参考open in new window

请求参数

参数名类型必填默认值说明平台差异说明
filePathString-要上传的文件对象-
cloudPathString-使用腾讯云时,表示文件的绝对路径,包含文件名。使用阿里云时,cloudPath为云端文件名-
fileTypeString--文件类型,支付宝小程序、钉钉小程序必填,可选image、video、audio-
onUploadProgressFunction-上传进度回调

响应参数

字段类型说明
fileIDString文件唯一 ID,用来访问文件,建议存储起来
requestIdString请求序列号,用于错误排查

示例代码

//前端代码
uni.chooseImage({
	count: 1,
	success(res) {
		console.log(res);
		if (res.tempFilePaths.length > 0) {
			let filePath = res.tempFilePaths[0]
			//进行上传操作
			const result = await uniCloud.uploadFile({
				filePath: filePath,
        		 cloudPath: Date.now() + '.jpg',
				onUploadProgress: function(progressEvent) {
			          console.log(progressEvent);
			          var percentCompleted = Math.round(
			            (progressEvent.loaded * 100) / progressEvent.total
			          );
			        }
			});
	}
});

Tips

  • 阿里云返回的fileID为链接形式可以直接使用,腾讯云返回的为cloud://形式,如需展示需要调用getTempFileURL获取链接
  • uniCloud.uploadFile 只有上传,没有文件选择。uni ui的封装了FilePicker组件 (opens new window)open in new window,从选择到上传一条龙。
已到达文章底部,欢迎留言、表情互动~
  • 赞一个
    0
    赞一个
  • 支持下
    0
    支持下
  • 有点酷
    0
    有点酷
  • 啥玩意
    0
    啥玩意
  • 看不懂
    0
    看不懂
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8