小程序uView2.X框架upload组件上传方法总结+避坑

news2024/11/19 14:26:15

呈现效果:

1.1单图片上传

1.2多图片上传

前言:相信很多人写小程序会用到uView框架,总体感觉还算OK吧,只能这么说,肯定也会遇到图片视频上传,如果用到这个upload组件相信你,肯定遇到各种各样的问题,这是我个人总结的单图片和多图片上传方法.

uView2.X框架:uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架

单图片上传:

页面结构:

<u-form-item prop="image1" ref="item">
          <view class="img">

            <u-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" name="1" multiple :maxCount="1"
              uploadIcon="plus" uploadIconColor="#0086ff" ref="upload" width="110" height="110">
            </u-upload>

            <image v-if="!fileList1[0].url" src="../../../static/images/photo.png" mode=""></image>
          </view>
          <view class="text">(*请提供真实头像)</view>
        </u-form-item>

1.首先定义的list 大家不要随便改,就按照官方的 

fileList1: [],

name="1" 标识符,

2.分别有上传 删除  几个方法

2.1删除方法

// 图像删除方法
      deletePic(event) {
        this[`fileList${event.name}`].splice(event.index, 1)
      },

2.2上传之前做的事情,比如 限制格式 限制大小 这点比较麻烦  ,里面注释写的比较详细

// 新增图片 这个是上传图像的方法
      async afterRead(event) {
        // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
        let lists = [].concat(event.file)
        // 用于存储符合条件的图片
        let Images = [];
        // 遍历上传的每张图片
        for (let i = 0; i < lists.length; i++) {
          const item = lists[i];
          // 验证图片格式
          const isImage = /\.(png|jpe?g)$/i.test(item.url);
          if (!isImage) {
            uni.showToast({
              title: '只能上传png,jpg,jpeg格式的图片',
              icon: 'none',
              duration: 3000
            });
            // 删除不符合条件的图片
            lists.splice(i, 1);
            // 跳过当前图片,进行下一张图片的验证
            continue;
          }
          // 验证图片大小
          const maxSize = 2 * 1024 * 1024; // 2MB大小限制
          if (item.size > maxSize) {
            uni.showToast({
              title: '图片大小不能超过2MB',
              icon: 'none',
              duration: 3000
            });
            // 删除不符合条件的图片
            lists.splice(i, 1);
            // 跳过当前图片,进行下一张图片的验证
            continue;
          }
          Images.push(item)
        }


        let fileListLen = this[`fileList${event.name}`].length
        Images.map((item) => {
          this[`fileList${event.name}`].push({
            ...item,
            status: 'uploading',
            message: '上传中'
          })
        })
        for (let i = 0; i < Images.length; i++) {
          const result = await this.uploadFilePromise(Images[i].url)
          // 返回给后端服务器的 结果需要赋值给 this.infoForm.image = result
          console.log(result, '上传图像result');
          // this.infoForm.avatar = result
          let item = this[`fileList${event.name}`][fileListLen]
          this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
            status: result.status,
            message: result.status == 'failed' ? '上传失败' : '',
            url: result.url
          }))
          fileListLen++
        }
      },

2.2.1 上传之前做了 格式和大小限制  如果不符合  直接删除 

2.3 上传成功的回调   主要是是上传的是一个json格式 一定要进行处理   JSON.parse(res.data).path,

而且这里做了状态判断  会有成功和失败判断  主要是上传失败可以叉掉  

和这里进行状态对应处理 

比较恶心的时候 不处理一直显示上传中  差不掉

// 回调函数方法
      uploadFilePromise(url) {
        return new Promise((resolve, reject) => {
          let a = uni.uploadFile({
            url: baseUrl + '/admin/upload/targetFile', //后端接口地址
            filePath: url,
            name: 'file', //传给后端参数
            header: {
              'token': uni.getStorageSync('whjk_token')
            },
            formData: {
              path: 'avatar/user'
            },
            success: (res) => {
              console.log(res, 'uploadFilePromise');
              // resolve(JSON.parse(res.data).path)
              if (res.statusCode == 200) { 
                resolve({
                  url: JSON.parse(res.data).path,
                  status: 'success'
                })
              } else {
                resolve({
                  url: url,
                  status: 'failed'
                })
              }
            }
          });
        })
      },

2.3传参说明  参数要 搞正确 

         uni.uploadFile({
            url: baseUrl + '/admin/upload/targetFile', // 后端接口地址
            filePath: url,
            name: 'file', //传给后端参数
            header: {
              'token': uni.getStorageSync('whjk_token')
            },
            formData: {
              path: 'avatar/user' // 后端给的路径 看情况而定
            },

多图片上传或者视频上传:

fileList2: [], //  不要随意定义
name = "2"

其实上传方法都一样的 就是属性需要改一下就行  判断都是一样的方法

1.需要修改这个属性

accept="image/*,video/*,.pdf"

2.页面结构

<u-form-item prop="annexPhoto" ref="item1">
          <view class="common">
            <text class="tex">展示附件</text>
            <text class="ext">(最多6个,仅支持png,jpg,jpeg格式上传)</text>
          </view>
          <view class="upload">
            <u-upload :fileList="fileList2" @afterRead="imageOrVideoOrPdf" @delete="deletePicPdf" name="2" multiple
               accept="image/*,video/*,.pdf"
              :maxCount="6" uploadIcon="plus" uploadIconColor="#0086ff" :deletable="true">
            </u-upload>
          </view>
        </u-form-item>

3.上传前限制  大小  图片   格式   里面注释写的很详细

// 视频image和pdf方法
      async imageOrVideoOrPdf(event) {
        console.log(event);
        // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
        let lists = [].concat(event.file);
        // 用于存储符合条件的图片
        let validImages = [];
        // 遍历上传的每张图片
        for (let i = 0; i < lists.length; i++) {
          const item = lists[i];
          // 验证图片格式
          const isImage = /\.(png|jpe?g)$/i.test(item.url);
          if (!isImage) {
            uni.showToast({
              title: '只能上传png,jpg,jpeg格式的图片!',
              icon: 'none',
              duration: 5000
            });
            // 删除不符合条件的图片
            lists.splice(i, 1);
            // 跳过当前图片,进行下一张图片的验证
            continue;
          }
          // 验证图片大小
          const maxSize = 2 * 1024 * 1024; // 2MB大小限制
          if (item.size > maxSize) {
            uni.showToast({
              title: '图片大小不能超过2MB!',
              icon: 'none',
              duration: 5000
            });
            // 删除不符合条件的图片
            lists.splice(i, 1);
            // 跳过当前图片,进行下一张图片的验证
            continue;
          }
          // 符合条件的图片添加到validImages数组中
          validImages.push(item);
        }

        let fileListLen = this[`fileList${event.name}`].length;
        validImages.map((item) => {
          this[`fileList${event.name}`].push({
            ...item,
            status: 'uploading',
            message: '上传中'
          })
        })

        for (let i = 0; i < validImages.length; i++) {
          const result = await this.uploadFileOrPdf(validImages[i].url);
          console.log(result);
          // 返回给后端服务器的结果需要赋值给 this.infoForm.annex = result
          let item = this[`fileList${event.name}`][fileListLen];
          // console.log(fileListLen);
          this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
            status: result.status,
            message: result.status == 'failed' ? '上传失败' : '',
            url: result
          }));
          console.log(result, 'result');
          if (result.status == 'success') {
            this.imgarr.push(result);
            console.log(this.imgarr,'imgarr');
          }
          fileListLen++;
        }
        // 将上传成功的url数组一起提交给后端
        // this.infoForm.annex = urls
      },

4.上传成功回调   注释的地方有写  可以上传 pdf  视频  图片 改一下path路径就行  

// 视频image和pdf方法回调函数
      uploadFileOrPdf(url) {
        // let uploadedFilePaths = [];
        return new Promise((resolve, reject) => {
          // let path;
          // const fileExtension = url.split('.').pop().toLowerCase();
          // if (['jpg', 'jpeg', 'png', 'gif'].includes(fileExtension)) {
          //   path = 'annex/image'; // 图片路径
          // } else if (fileExtension === 'pdf') {
          //   path = 'annex/pdf'; // PDF路径
          // } else {
          //   reject('Invalid file type');
          //   return;
          // }
          uni.uploadFile({
            url: baseUrl + '/admin/upload/targetFile', //后端接口地址
            filePath: url,
            name: 'file', //传给后端参数
            header: {
              'token': uni.getStorageSync('whjk_token')
            },
            formData: {
              path: 'annex/image' // 根据文件后缀类型设置路径
            },
            success: (res) => {
              console.log(res);
              // resolve(JSON.parse(res.data).path)
              if (res.statusCode == 200) {
                resolve({
                  url: JSON.parse(res.data).path,
                  status: 'success'
                })
              } else {
                resolve({
                  url: url,
                  status: 'failed'
                })
              }
            },
            fail: (err) => {
              // console.log(err,'err');
              reject(err);
            }

          });
        })
      },

5.删除方法

 // 图像删除方法
      deletePic(event) {
        this[`fileList${event.name}`].splice(event.index, 1)
      },

6.最终呈现的效果就是这样

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE学习值之--String类

&#x1f495;"不要同情自己&#xff0c;同情自己是卑劣懦夫的勾当&#xff01;"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JavaSE学习值之--String类 目录 前言&#xff1a; 一.String类 1.String类的属性 2.字符串的构造 注意&#xf…

基于YOLOv8模型的塑料瓶目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的塑料瓶目标检测系统可用于日常生活中检测与定位塑料瓶目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

翻译docker官方文档(残缺版)

Build with docker(使用 Docker 技术构建应用程序或系统镜像) Overview (概述) 介绍&#xff08;instruction&#xff09; 层次结构&#xff08;Layers&#xff09; The order of Dockerfile instructions matters. A Docker build consists of a series of ordered build ins…

“高级Vue状态管理 - Vuex的魅力与应用“

目录 引言1. Vuex的简介1.1 什么是Vuex&#xff1f;1.2 Vuex的核心概念 2. Vuex的值获取与改变(综合案例)3. Vuex的异步请求总结 引言 在现代Web开发中&#xff0c;前端应用变得越来越复杂。随着应用规模的扩大和数据流的复杂性增加&#xff0c;有效地管理应用的状态成为了一项…

Android---Synchronized 和 ReentrantLock

Synchronized 基本使用 1. 修饰实例方法 public class SynchronizedMethods{private int sum 0;public synchronized void calculate(){sum sum 1;} } 这种情况下的锁对象是当前实例对象&#xff0c;因此只有同一个实例对象调用此方法才会产生互斥效果&#xff1b;不同的…

APP测试常见功能测试点汇总

1、安装和卸载 安装和卸载是任何一款APP中都属于最基本功能。一旦出错&#xff0c;就属于优先级为紧要的BUG。因此APP的安装和卸载应作为一个测试点多加重视。 1 应用是否可以正常安装&#xff08;命令行安装&#xff1b;豌豆荚&#xff0f;手机助手等第三方软件安装&#xff…

B树、B+树详解

B树 前言   首先&#xff0c;为什么要总结B树、B树的知识呢&#xff1f;最近在学习数据库索引调优相关知识&#xff0c;数据库系统普遍采用B-/Tree作为索引结构&#xff08;例如mysql的InnoDB引擎使用的B树&#xff09;&#xff0c;理解不透彻B树&#xff0c;则无法理解数据…

【通信系列 1 -- GSM 和 LTE】

文章目录 1. LTE(Long Term Evolution)1.1 FDD&TDD简介1.1.1 3G与4G差异1.1.2 频点与band关系1.1.3 band 与运营商的关系 1.2 TDD&FDD区别1.2.1 FDD帧结构1.2.2 TDD帧结构1.2.3 TDD&FDD优势对比1.2.4 TDD缺点 1.3 VoLTE1.3.1 VoLTE 优点11.3.2 VoLTE 优点21.3.3 Vo…

redis-6.2.7 集群安装3主3从

因为资源有限准备了3 台 服务器&#xff0c;先查看防火墙的端口是否开放&#xff0c;如果没有开放先开放端口我使用的 6379 和 6380 这两个端口 所以将这两个端口放开。去redis 官网下载redis 安装包。下载地址 &#xff1a; redis 安装包下载 3. 安装redis 上传上去之后 3 台…

【Java 进阶篇】JavaScript 数据类型详解

JavaScript是一种弱类型脚本语言&#xff0c;具有动态类型。这意味着JavaScript中的变量可以容纳不同类型的数据&#xff0c;并且它们的类型可以在运行时更改。在本文中&#xff0c;我们将深入探讨JavaScript中的数据类型&#xff0c;包括原始数据类型和引用数据类型&#xff0…

TCP/IP(十)TCP的连接管理(七)CLOSE_WAIT和TCP保活机制

一 CLOSE_WAIT探究 CLOSE_WAIT 状态出现在被动关闭方,当收到对端FIN以后回复ACK,但是自身没有发送FIN包之前 ① 服务器出现大量 CLOSE_WAIT 状态的原因有哪些? 1、通常来讲,CLOSE_WAIT状态的持续时间应该很短,正如SYN_RCVD状态2、但是在一些特殊情况下,就会出现大量连接长…

【动态库】Ubuntu 添加动态库的搜索路径

在运行程序时&#xff0c;经常遇到下面这种动态库加载失败的情况&#xff0c;这时往往是系统在动态库的搜索路径下没有找到对应的库文件导致的。 目录 一、使用 LD_LIBRARY_PATH 二、修改 /etc/ld.so.conf 一、使用 LD_LIBRARY_PATH 环境变量 LD_LIBRARY_PATH是动态库的搜索…

【例题】逆波兰表达式求值(图解+代码)

【例题】逆波兰表达式求值(图解代码) 这里写目录标题 【例题】逆波兰表达式求值(图解代码)逆波兰表达式解释优点转换计算代码 题目描述 : 逆波兰表示法是一种将运算符&#xff08;operator&#xff09;写在操作数&#xff08;operand&#xff09;后面的描述程序&#xff08;算式…

1600*A. Linova and Kingdom(DFS优先队列贪心)

Problem - 1336A - Codeforces Linova and Kingdom - 洛谷 解析&#xff1a; 开始认为分情况讨论 k 小于等于叶子结点和大于叶子结点的情况&#xff0c;然后选择深度最深的叶子结点和子孙数量最小的结点&#xff0c;但是发现如果把某一个非叶子结点选取&#xff0c;那么其子孙…

VTP协议

VTP的概念 个人简介 VTP--------------VLAN Trunking protocol VLAN干道协议&#xff08;思科私有协议&#xff09; 同步VLAN编号 VTP&#xff08;Virtual Trunking Protocol&#xff09;是思科&#xff08;Cisco&#xff09;网络设备中的一种协议&#xff0c;用于在交换机之…

Qt QMultiMap

QMultiMap 文章目录 QMultiMap摘要QMultiMapQMultiMap 特点代码示例 关键字&#xff1a; Qt、 QMultiMap、 容器、 键值、 键值重复 摘要 今天在观摩小伙伴撸代码的时候&#xff0c;突然听到了QMultiMap自己使用Qt开发这么就&#xff0c;竟然都不知道&#xff0c;所以趁没…

【环境】我决定半场开香槟!ubuntu20.04 安装 pytorch

还在下载当中&#xff0c;我决定半场开香槟&#xff01;自信稳定安装成功&#xff01; ubuntu20.04 安装 pytorch 硬件及其他环境&#xff1a;win10 ubuntu20.04 3080显卡查找pytorch的版本是最重要的、也是最耽误时间的 PyTorch中torch、torchvision、torchaudio版本对应关…

使用IntelliJ Idea必备的插件!

趁手的工具让开发事半功倍&#xff0c;好用的IDEA插件让效率加倍。 今天给大家分享几个优秀的IDEA插件。 插件安装 首先得知道在IDEA哪安装插件&#xff1f; 点击File---->Settings---->找到Plugins标签&#xff0c;即可搜索想要的插件进行安装了。 现在来看下有哪些值…

bigemap制作专题地图-标绘图斑-标绘设计地图

制作专题地图-标绘图斑-标绘设计地图 发布时间&#xff1a;2018-01-17 版权&#xff1a;BIGEMAP 同步视频教程&#xff1a;卫星地图_高清卫星地图_卫星地图视频_制作专题地图-设计规划测量地图应用详解 专题地图制作视频教程&#xff1a;卫星地图_高清卫星地图_卫星地图视频_地…

点餐小程序实战教程09-订单功能开发

目录 1 创建数据源2 订单确认功能3 提交订单4 订单成功页面总结 我们上一篇已经将商品加入了购物车&#xff0c;如果购买完毕&#xff0c;点击选好了按钮就进入到订单确认页面&#xff0c;确认无误后就写入到订单表。为了实现上述的业务逻辑&#xff0c;我们需要先创建数据源来…