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

【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.xdnf.cn/news/16631.html

相关文章:

  • Python系统交互库全解析
  • Cloudflare CDN 中设置地域限制并返回特定界面
  • 基于Vue3.0+Express的前后端分离的任务清单管理系统
  • 虚拟地址空间:从概念到内存管理的底层逻辑
  • “本地计算机上的 mysql 服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止”解决方式
  • R语言与作物模型(DSSAT模型)技术应用
  • 从0开始学习R语言--Day60--EM插补法
  • 深入解析IPMI FRU规范:分区结构与字段标识详解
  • CMakelists.txt 实现多级目录编译
  • Kafka 3.9.1的KRaft模式部署
  • 【Spring Boot 快速入门】二、请求与响应
  • Java设计模式之<建造者模式>
  • 稳定币催化下,Web3 支付赛道将迎来哪些爆发?
  • 二十一、动植物类(自然生态)
  • CodeBuddy的安装教程
  • 神经网络的基本骨架-nn.Module的使用和卷积操作
  • 燃气管网运行工考试练习题
  • 如何提升 TCP 传输数据的性能?详解
  • 【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(一)
  • Windows 系统分辨率切换** 与 **Qt4 无边框窗口管理机制** 的交互
  • haproxy实列
  • 【深度学习优化算法】10:Adam算法
  • DDD领域驱动中瘦模型与富态模型的核心区别
  • SpringCloude快速入门
  • 2025最新Mybatis-plus教程(三)
  • java的break能加标签,return可以加标签吗
  • Java#包管理器来时的路
  • 常见认证机制详解
  • Python爬虫入门:从零开始抓取网页数据
  • LeetCode|Day27|70. 爬楼梯|Python刷题笔记