1. 前言

接手得 uniapp 开发的微信小程序项目,新的开发需求是需要同时上传图片和视频,但是之前的上传都没有进行封装,都是每个页面需要的时候单独实现,现在新的需求,有多个地方都需要上传图片、视频或语音等,这样就需要封装一个组件,然后发现部分地方使用了 uni-file-picker 组件,但是 uni-file-picker 在 grid 的时候只能进行图片的展示,如果是 video 或者 all 的时候,就会直接列表展示的文件名列表,不满足我当前的需求,因此在 uni-file-picker 基础上进行再次适配当前需求的封装。

2. 实现效果

输入图片说明

3. 分析

  1. 图片和视频同时预览展示,就需要判断上传的是否是视频或者图片;
  2. 根据接口判断是否上传文件的格式是否在允许范围内;
  3. 使用 uni-file-picker 需要改造,将文件预览列表隐藏,使用自定义的预览文件。

4. 判断是图片

export const isImageFile = (filename) => {// 定义常见的图片文件扩展名const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg']// 获取文件扩展名const fileExtension = filename.split('.').pop().toLowerCase()// 判断文件扩展名是否在图片扩展名列表中return imageExtensions.includes(fileExtension)
}

5. 判断是视频

// 判断是不是视频
export const isVideoFile = (filename) => {// 定义常见的视频文件扩展名const videoExtensions = ['mp4','avi','mov','mkv','flv','wmv','webm','mpeg','mpg']// 获取文件扩展名const fileExtension = filename.split('.').pop().toLowerCase()// 判断文件扩展名是否在视频扩展名列表中return videoExtensions.includes(fileExtension)
}

6. 根据接口判断是否是可上传格式文件

export const canUploadFile = (filename) => {const extensions = ['bmp','gif','jpg','jpe','png','mp4','mp3']// 获取文件扩展名const fileExtension = filename.split('.').pop().toLowerCase()// 判断文件扩展名是否在视频扩展名列表中return extensions.includes(fileExtension)
}

7. 预览图片和视频

uploadPreview 插槽是方便自定义预览,这里我是用 tailwindcss 实现了一个默认的视频和图片的预览样式。

<slot name="uploadPreview"><view class="cc mr-[20rpx] wh-[160] bd-[8] flex-none relative" v-for="(item,index) in fileLists" :key="item.url"><view class="icon-del-box" @click.stop="deletePic(item)"><view class="icon-del"></view><view class="icon-del rotate"></view></view><image v-if="item.isImage" :src="item.url" class="wh-[160] bd-[8] flex-none"></image><video v-else-if="item.isVideo" :src="item.url" class="wh-[160] bd-[8] flex-none"></video></view>
</slot>

8. 使用 uni-file-picker 上传

  1. 注意:是对 list 模式的文件上传,所以直接将 mode 的值写死 list;
  2. uploadButtom 自定义上传样式。
<uni-file-picker:limit="limit":file-mediatype="fileMediatype"@select="getUpload":is-upload-file="false":autoUpload="false"mode="list":value="fileLists"
><slot name="uploadButtom"><viewclass="cc bg-[#F9F9F9] wh-[160] bd-[8] b-[2rpx_#D0D0D0_dashed] flex-none"><image :src="$icon.publishAddIcon" class="wh-[48]"></image></view></slot>
</uni-file-picker>

9. 完整组件实现

<template><view class="ac"><slot name="uploadPreview"><view class="cc mr-[20rpx] wh-[160] bd-[8] flex-none relative" v-for="(item,index) in fileLists" :key="item.url"><view class="icon-del-box" @click.stop="deletePic(item)"><view class="icon-del"></view><view class="icon-del rotate"></view></view><image v-if="item.isImage" :src="item.url" class="wh-[160] bd-[8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916923.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916923.shtml
英文地址,请注明出处:http://en.pswp.cn/news/916923.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(nice!!!) (LeetCode 每日一题) 2411. 按位或最大的最小子数组长度(位运算+滑动窗口)

2411. 按位或最大的最小子数组长度 思路&#xff1a;位运算滑动窗口&#xff0c;时间复杂度0(n*32)。 **遍历每一个元素nums[i]&#xff0c;然后看能否改变它前面的元素nums[j]&#xff08; j<i &#xff09;&#xff0c; 当(nums[j]|nums[i])nums[j]时&#xff0c;说明当前…

算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现

//#include<bits/stdc.h> #include<iostream> using namespace std; const int N1e510; //定义 int e[N],pre[N],ne[N],h,id; int mp[N]; //头插 // 兵 y // x void push_front (int x) {id;e[id]x;mp[x]id;pre[id]h;ne[id]ne[h];//先修改新节点…

津发科技带你了解皮肤电信号中的SCL与SCR

皮肤电&#xff08;Electrodermal Activity, EDA&#xff09;作为一种非常容易获取的基本生理信号&#xff0c;可以很好地量化我们的情绪反应&#xff0c;被广泛应用于情感识别研究中。它代表机体受到刺激时皮肤电传导的变化。皮肤电反应作为交感神经系统功能的直接指标&#x…

spark的broadcast variables

在 Spark 中&#xff0c;广播变量&#xff08;Broadcast Variables&#xff09; 是一种特殊类型的共享变量&#xff0c;用于高效地在集群中的所有节点间分发大型只读数据集。它解决了 Spark 任务中频繁传输重复数据的性能问题&#xff0c;特别适用于需要在多个任务中重用相同数…

Python爬虫实战:研究Haul库相关技术构建电商数据采集与分析系统

1. 引言 1.1 研究背景与意义 随着电子商务的迅速发展,电商平台上的商品数据呈现爆炸式增长。这些数据蕴含着丰富的商业价值,如消费者行为分析、市场趋势预测、竞争对手监测等。然而,如何从海量的电商数据中获取有价值的信息,成为当前电商企业面临的重要挑战。 网络爬虫技…

Java:高频面试知识分享1

一、Java 语言核心特性&#xff08;面向对象编程&#xff09;核心知识点梳理&#xff1a;面向对象三大特性&#xff1a;封装&#xff1a;隐藏对象内部实现&#xff0c;通过 public 方法暴露接口&#xff08;例&#xff1a;类的 private 字段 get/set 方法&#xff09;。继承&a…

MybatisPlus-核心功能

目录 条件构造器 QueryWrapper UpdateWrapper LambdaQueryWrapper 自定义SQL 基本用法 多表关联 Service接口 CRUD 基本用法 Lambda 批量新增 条件构造器 除了新增以外&#xff0c;修改、删除、查询的SQL语句都需要指定where条件。因此BaseMapper中提供的相关方法…

RHCE综合项目:分布式LNMP私有博客服务部署

一、项目概述本次项目基于LNMP&#xff08;linux&#xff0c;nginx&#xff0c;mariadb&#xff0c;php&#xff09;搭建了一个私有的博客平台&#xff0c;本篇博客详细记录了该博客平台的服务部署全流程。在该项目中&#xff0c;使用了两台linux&#xff08;openeuler&#xf…

5种安全方法:如何删除三星手机上的所有内容

随着新的三星设备不断推出&#xff0c;在出售或捐赠旧手机之前&#xff0c;彻底清除旧手机上的数据以保护隐私至关重要。许多人不知道的是&#xff0c;简单的删除操作并不能完全清除三星设备上的数据&#xff0c;被删除的文件可能会处于不可见状态。本文介绍了如何彻底删除三星…

Vue 3 入门教程 2- Vue 组件基础与模板语法

一、Vue 组件基础在 Vue 中&#xff0c;组件是构建用户界面的基本单位&#xff0c;它可以将页面拆分成多个独立、可复用的部分。一个 Vue 组件通常以 .vue 文件名结尾&#xff0c;包含三个核心部分&#xff1a;模板&#xff08;Template&#xff09;、脚本&#xff08;Script&a…

Linux 进程管理与计划任务详解

Linux 进程管理与计划任务详解 一、程序与进程的基本概念 程序&#xff1a;保存在外部存储介质中的可执行机器代码和数据的静态集合&#xff0c;是静态的文件实体进程&#xff1a;在 CPU 及内存中处于动态执行状态的计算机程序&#xff0c;是程序的动态执行实例关联关系&#x…

分层解耦(Controller,Service,Dao)

1. 三层架构核心职责层级职责说明关键技术 / 注解Controller&#xff08;控制器&#xff09;1. 接收前端请求&#xff08;HTTP&#xff09; 2. 封装参数、校验 3. 调用 Service 处理业务 4. 返回视图 / 数据给前端Controller、GetMapping等Service&#xff08;业务层&#xff0…

镁金属接骨螺钉注册检测:骨科植入安全的科学基石

在骨科治疗领域&#xff0c;镁金属接骨螺钉凭借其可降解性与生物相容性&#xff0c;成为传统金属植入物的革新替代方案。然而&#xff0c;作为Ⅲ类高风险无源植入器械&#xff08;分类编码13-01-01&#xff09;&#xff0c;其注册检测需覆盖生物相容性、化学表征、降解性能、力…

模具开发和管理系统(c#)

以前编写的一个管理模具开发和进度的程序&#xff0c;可以跟踪模具开发进度&#xff0c;可以查询模具具体情况&#xff0c;也可以用水晶报表查询。OS&#xff1a;microsoft windows IDE&#xff1a;microsoft visual studio programming language&#xff1a;C# DataBase&#…

【WRF-Chem 实例1】namelist.input 详解- 模拟CO2

目录 &time_control(时间控制) &physics(物理过程参数化方案) &fdda(四维数据同化) 工作机制简述 &dynamics(WRF 动力核心的数值方法和选项) &bdy_control(边界控制设置) &chem(WRF-Chem 主要化学设置) &namelist_quilt(并行 I/O 控制…

数据中心-时序数据库InfluxDB

目录 一、InfluxDB介绍 1.1 什么是InfluxDB&#xff1f; 1.2 应用场景 1.3 特点 1.4 版本差异 二、数据模型和存储架构 2.1 相关概念 2.2 存储架构 三、InfluxDB基础操作 3.1 数据库操作 3.2 数据表操作 显示所有表 新建表 删除表 3.3 数据保存策略 查看保存策…

webpack-高级配置

多入口文件 如何输出多个html文件 输入位置 需要写两个entryoutput位置也要改一下 加一个name避免重名 在生成html时 要根据每一个入口都写一个插件 并且chunks要写好 当前html引入哪些文件如何抽离压缩css文件 安装插件在rules里面添加插件plugins中添加css抽离代码压缩css抽离…

WinForm组件之Label 控件

Label 控件Label 控件是 WinForm 中最基础、最常用的控件之一&#xff0c;主要用于在界面上显示文本信息&#xff0c;通常作为说明、提示或标题&#xff0c;不直接接受用户输入。它是构建用户界面的基础组件&#xff0c;在引导用户操作、展示状态信息等方面发挥重要作用。Label…

鸿蒙中相册权限弹窗

model.json5配置权限{"name": ohos.permission.READ_MEDIA,"reason":"$string:permission_reason_IMG","usedScene": {}}ui使用const url albumClass.onRequestCameraPermission()类import { abilityAccessCtrl, common, PermissionR…

智能车辆热管理测试方案——提升效能与保障安全

车辆热管理在能源危机出现、汽车排放法规日益严格以及人们对汽车舒适性要求更高的背景下应运而生。将各个系统或部件如冷却系统、润滑系统和空调系统等集成一个有效的热管理系统&#xff1b;控制和优化车辆的热量传递过程&#xff0c;保证各关键部件和系统良好运行&#xff1b;…