【Uniapp】 uni-file-picker组件 上传图片或文件大小限制

目录

介绍

方案1:

方案2:

方案3:

常用文件单位大小及换算方式补充:

换算公式


介绍

        uni-file-picker文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间。但在开发过程中,我发现官方组件uni-file-picker不能设置单个图片或文件的大小限制,不满足开发需求。以下提供几种解决方案,仅供参考。

方案1:

直接修改源代码,优点是简单容易理解,缺点本处代码修改只能限制图片大小,文件大小限制需要灵活运行,或继续浏览以下方案。

uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js

根据以上路径,打开choose-and-upload-file.js文件,找到chooseImage方法。新增代码中标注部分,即可实现图片大小限制。

function chooseImage(opts) {
	const {
		count,
		sizeType = ['original', 'compressed'],
		sourceType,
		extension
	} = opts
	return new Promise((resolve, reject) => {
		uni.chooseImage({
			count,
			sizeType,
			sourceType,
			extension,
			success(res) {
                //核心代码
                //--------------------------------------------------------
				const pictureSize = res.tempFiles[0].size / (1024*1024)
				if(pictureSize<1){
					uni.showToast({
						title:'上传图片大小不能超过1M',
						duration:2000,
						icon:"none"
					})
					return
				}
                //---------------------------------------------------------
				resolve(normalizeChooseAndUploadFileRes(res, 'image'));
			},
			fail(res) {
				reject({
					errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL),
				});
			},
		});
	});
}

方案2:

直接修改源代码,相对方案1更加灵活,复用性较高。

uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue

根据以上路径,打开uni-file-picker.vue文件。

在props中定义一个属性,用来记录可上传的文件最大值。

props: {
   		maxSize:{
   			type:Number,
   			default:1
   		}
  }

 找到chooseFileCallback方法,插入以下代码。

//限制文件大小为maxSize 单位M
for (let i = 0; i < files.length; i++) {
	let fileSize = files[i].size / (1024 * 1024)
	if (fileSize  > this.maxSize) {
		uni.showToast({
			title: '文件大于'+this.maxSize+'MB,删除该文件',
			icon: "none"
	    });
        //删除超过大小限制的文件
	    res.tempFiles.splice(i,1)
	}
}

 其他页面调用即可,调用时传入的数值就是可上传的最大值。

 <uni-file-picker :maxSize="2"  limit="6"></uni-file-picker>

 方案2参考:uni-ui 中 uni-file-picker组件限制用户上传大小超过大小自动去除_uni-file-picker限制大小-CSDN博客

方案3:

相对方案1,方案2来说,方案3是最繁琐的实现方式。优点是限制文件大小的同时,实现了文件预览。

uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue

这样写的初衷,是为了解决文件预览问题,因为uni-file-picker组件没有pdf,word等文件预览功能,解决文件预览问题的同时,也给限制文件大小提供了新的解决方案。

1.根据以上路径,打开uni-file-picker.vue文件,不传filesList值,修改如下。这样组件在调用时,就不会回显已上传的文件。

<!-- 修改前 -->
<upload-file v-if="fileMediatype !== 'image' || showType !== 'grid'" :readonly="readonly"
			:list-styles="listStyles" :files-list="filesList" :showType="showType" :delIcon="delIcon"
			@uploadFiles="uploadFiles" @choose="choose" @delFile="delFile">
			<slot><button type="primary" size="mini">选择文件</button></slot>
</upload-file>


<!-- 修改后:不传filesList -->
<upload-file v-if="fileMediatype !== 'image' || showType !== 'grid'" :readonly="readonly"
			:list-styles="listStyles" :showType="showType" :delIcon="delIcon"
			@uploadFiles="uploadFiles" @choose="choose" @delFile="delFile">
			<slot><button type="primary" size="mini">选择文件</button></slot>
</upload-file>

 2.调用@select方法获取文件信息。自己定义一个变量fileList,回显已上传文件。此处css代码没有上传,根据需求简单设计即可,也可参考微信官方文档的样式。

<uni-file-picker ref="files" v-model="fileLists" limit="5" file-mediatype="all" file-extname="doc,docx,pdf" title="最多选择5个文件(仅支持Word,PDF文件)"
			@select="selectFile">
	 <button class="addFile" v-if="editable">选择文件</button>
</uni-file-picker>
//已上传的文件回显
<view class="style" v-for="(item, index) in fileLists" :key="index">
	<view class="u-flex u-row-between">
        //此处的Preview 为预览方法,在此处不做详细展示
		<view class="u-flex" @click="Preview(item)">{{ item.name }}</view>
        //此处的delFile 为文件删除方法,在此处不做详细展示
		<view class="u-flex" @click="delFile(index)">
		    <image src="@/static/close1.png" mode="" style="width: 32rpx; height: 32rpx; margin-right: 20rpx;"></image>
		</view>
	</view>
</view>

3.在selectFile()方法中,处理文件大小的限制,符合需求的文件push到fileList。

selectFile(e){
		console.log("获取上传状态,选择文件:",e)
		let fileSize
		e.tempFiles.forEach(item => {
			fileSize = item.size / (1024 * 1024)
			console.log(item.name,"文件大小:",item.size,"字节")
			console.log(item.name,"文件大小:",fileSize ,"mb")
			if(fileSize <1){
				this.fileLists.push({  //用一个变量单独存储上传的文件数据
				name: item.file.name,
				extname: item.extname,
				urlTemporary: item.url,
				url:''
				})
			}else{
				setTimeout(()=>{
					uni.$showMsg('文件大小不得超过1M')
				})
			}
		})
        //后面根据不同的开发需求做其他处理。
}

常用文件单位大小及换算方式补充:

Bytes(字节)

字节是计算机数据存储的基本单位。一字节等于8位。字节是最小的可以独立表示一个字符(字母、数字或者其他符号)的单位。一个英文字符,如"A"或"1",通常占用1字节。

KB(千字节)
这个单位通常用于表述较小的文件大小。一份简短的文档或一张小图片,可能会有几十到几百KB。

MB(兆字节)
这个单位通常用于表述中等大小的文件,如图片或音频文件。一首MP3格式的音乐,通常在3-5MB。一部手机拍摄的照片,可能在1-5MB。

GB(吉字节)
这个单位通常用于表述较大的文件,如电影或系统文件。一部标清电影,可能在1-2GB。一个操作系统,可能在10-20GB。

TB(太字节)
这个单位通常用于表述非常大的数据集,如数据库或大型服务器的存储。大型企业的数据库,可能在几十到几百TB。一台服务器的硬盘,可能在1-10TB。

换算公式

  • 1 KB = 1024 Bytes
  • 1 MB = 1024 KB
  • 1 GB = 1024 MB
  • 1 TB = 1024 GB
  • 1 PB = 1024 TB
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值