当前位置: 首页 > news >正文

【uniapp】---- 使用 uniapp 实现视频和图片上传且都可以预览展示

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.dtcms.com/a/302302.html

相关文章:

  • NVMe高速传输之摆脱XDMA设计20:PCIe请求模块设计(上)
  • 【mysql慢查询】
  • “太赫兹”
  • Java学习-----如何创建线程
  • 【科普】STM32CubeMX是配置工具,STM32CubeIDE是集成开发环境,二者互补但定位不同,前者负责初始化配置,后者专注代码开发调试。
  • DDD领域驱动中瘦模型与富态模型的核心区别
  • 设计模式(二十四)行为型:访问者模式详解
  • PostgreSQL日志配置全解析:从基础设置到进阶策略
  • 用 Python 获取电脑电池电量的各种案例
  • Python数据处理基础(学习笔记分享)
  • 【Spring WebFlux】 三、响应式流规范与实战
  • 科技赋能成长 脑力启迪未来
  • JVM 内存共享区域详解
  • Uniswap V2 成功上线 PolkaVM:Polkadot Hub 的里程碑时刻
  • 5190 - 提高:DFS序和欧拉序:树上操作(区域修改1)
  • 28天0基础前端工程师完成Flask接口编写
  • Ethereum:Geth运维实战,geth export与geth import命令的实用性深度评估
  • 【C++】手搓一个STL风格的vector容器
  • 【华为机试】210. 课程表 II
  • Kernel PWN 入门(二)
  • 【深度学习优化算法】10:Adam算法
  • Mybatis_4
  • 设计模式十二:门面模式 (FaçadePattern)
  • Kafka——请求是怎么被处理的?
  • 6.2 总线事务和定时 (答案见原书 P295)
  • 疏老师-python训练营-Day28类的定义和方法
  • 【LeetCode 热题 100】35. 搜索插入位置——二分查找(闭区间)
  • 区块链分叉原理与代码仿真
  • leetcode 2044. 统计按位或能得到最大值的子集数目 中等
  • 主要分布于内侧内嗅皮层的层Ⅲ的网格-速度联合细胞(Grid × Speed Conjunctive Cells)对NLP中的深层语义分析的积极影响和启示