【Vant Weapp】van-uploader 文件上传

news2025/2/27 6:19:40

目录

图片上传

图片回填

修改样式

循环多个上传图片

自定义上传的控件


图片上传

未上传样式:

上传限制6张后 :

 

<van-uploader 
      max-count="6" 
      file-list="{{ fileList }}" 
      bind:after-read="afterRead" 
      bind:delete="delete"
      multiple="{{true}}" 
      upload-text='上传图片' 
/>

 fileList的图片要求的是全路径(http://xxxxx.com/xxxxx.png),而后端要求是去除域名(xxxxx.png),所以我另外封装了一个imgs数组。

data: {
    fileList: [], 
    imgs: [], 
    baseUrl:"http://xxxxx.com"
}
afterRead(event) {
  const { file } = event.detail;
  let that = this
  // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式
  wx.uploadFile({
    url: 'http:xxxxx.com/upload',
    filePath: file[0].url,
    name: 'files',
    header: {
      "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
    },
    formData: {},
    success: function (res) {

      // http://xxxxx.com/xxxxx.png
      const fileList = [...that.data.fileList]
      const url = 'http:xxxxx.com' + JSON.parse(res.data).data[0]
      fileList.push({url}) 

      // /xxxxx.png
      const imgs = [...that.data.imgs]
      imgs.push(JSON.parse(res.data).data[0]) 
      
      that.setData({
        imgs,
        fileList
      })
    },
  })
},

// 删除图片
delete(e) {
  let idx = e.detail.index

  let fileList = this.data.fileList
  fileList.splice(idx, 1)

  let imgs = this.data.imgs
  imgs.splice(idx, 1)
  
  this.setData({
    fileList,
    imgs
  })
},

图片回填

进入页面onload就要去调取接口,获取回填的数据。getPicture是获取数据的接口,可以自行换成自己的。

后台返回:

[
  {
    img:'/xxx.png',
    name:'xxx'
  }
]

 fileList需要的是:

[
  {
    url:'/xxx.png',
    name:'xxx'
  }
]
onLoad() {
    getPicture({
      id: this.data.id,
    }).then(res => {
      let imgs = []
      res.data.forEach((v) => {
        v.url = v.img // 接口中返回的名称,但是控件要求是url
        
        // 获取没有域名(/xxxxx.png)的数据。
        var reg = new RegExp(baseUrl,"g"); 
        var url = v.img.replace(reg,"");
        imgs.push(url)
      });
      this.setData({
        imgs,
        fileList: res.data
      })
    })
}

修改样式

/*上传框*/
.van-uploader .van-uploader__wrapper .van-uploader__upload {
  width: 160rpx !important;
  height: 160rpx !important;
}

/*小相机*/
.van-uploader__upload-icon {
  font-size: 80rpx !important;
}

循环多个上传图片

问题:由于afterRead无法传参,所以我在父级节点上添加点击事件。

<view class="list">
  <view class="item" wx:for-items="{{list}}" wx:key="index">
    <view class="box" data-index="{{index}}" bind:tap="up">
      <van-uploader 
        preview-size="200rpx" 
        max-count="3" 
        file-list="{{item.fileList}}" 
        bind:after-read="afterRead"
        bind:delete="delete" 
        multiple="{{true}}" 
        upload-text='上传图片' 
      />
    </view>
  </view>
</view>

 第一步:初始化的时候给list每一项添加fileList数组

onLoad: function (options) {
  this.getList()
},

getList() {
  let id = this.data.id
  getList({ id }).then(res => {
    let list = res.data
    if(list && list.length>0) {
      list.forEach((v,k)=>{
        v.fileList = []
      })
    }
    this.setData({
      list
    })
  }).catch(err => {
    console.log(err)
  })
},

第二步:得到点击时的index

up (e) {
  this.setData({
    idx: e.currentTarget.dataset.index
  })
},

第三步:上传成功后,压缩图片并且上传服务器。上传成功后,找到第index个fileList塞入图片。

afterRead(event) {
  const that = this
  const { file} = event.detail; 


  // 压缩图片
  wx.compressImage({ 
    src: file[0].url, //路径
    quality: 70, // 质量
    compressedWidth: 600,
    success(res){


      // 上传服务器
      wx.uploadFile({
        url: `http:xxxxx.com/commons/upload`,
        filePath: res.tempFilePath,//相当于file[0].url,
        name: 'files',
        header: {
          "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
        },
        formData: {},
        success: function (res) {
          const list = that.data.list
          const fileList = list[that.data.idx].fileList
          fileList.push({
            url: 'http://xxxxx.com' + JSON.parse(res.data).data[0],
            name: '1'
          })
          that.setData({
            taskInfo: list
          })
        },
        fail: function (res) {}
      })

    },
  })
},

第四步:设置删除图片

delete(e) {
  let that = this
  let index = e.detail.index
  const list = that.data.list
  const fileList = list[that.data.idx].fileList
  fileList.splice(index, 1)
  this.setData({
    list: list
  })
},

自定义上传的控件

需求是点击右侧的加号,新增的图片在下方区域展示。

问题一:

第一步:参考Vant Weapp - uploader中自定义上传样式。将按钮改成加号图片。

<view class="list">
    <view class="item" wx:for-items="{{list}}" wx:key='index'  data-item='{{item}}'>

      <!-- 上传图片区域 -->
      <view class="box" style="display: flex; align-items: center;">
        <view class="name"  style="margin-left: 10rpx">图片</view>
        <van-uploader max-count="3" file-list="{{ item.fileList }}" bind:after-read="afterRead" bind:delete="delete" data-item="{{item}}" data-index="{{index}}">
          <image class="add" src="../../assets/images/add.png"></image>
        </van-uploader>
      </view>


      <!-- 图片展示区域 -->
      <view class="img_list">
        <view class="img_box" wx:for-items="{{item.imgData}}" wx:key="item" wx:for-index="k" wx:for-item="v">
          <!-- 删除按钮 -->
          <van-icon name="clear" class="close" catchtap='deleteImg' data-k="{{k}}" data-v="{{v}}" data-item="{{item}}" data-index="{{index}}"/>
          <!-- 图片 -->
          <image class="img" mode="aspectFit" src="{{'http://www.xxxx.com'+v}}" data-src="{{'http://www.xxxx.com'+v}}" data-item="{{item}}" alt="图片"/>
        </view>
      </view>
      
    </view>
  </view>

第二步:上传图片后,控件默认上传后展示图片在加号的前面。

 这就导致了位置有偏移。最后只能自定义一个图片展示区域了。隐藏默认图片展示

.van-uploader__preview {
  display: none!important;
}

第三步:初始化给每一项都添加fileList和imgList

onLoad: function (options) {
  this.getList()
},
getList() {
  getList({id}).then(res => {
    res.data.forEach((v)=>{
      v.fileList = []
      v.imgData = []
    })
    this.setData({
      list: res.data
    })
  })
}

 第四步:将上传成功的图片回填

afterRead(event) {
  const that = this
  const { file} = event.detail; 
  
  let index = that.data.index

  wx.uploadFile({
    url:'http://xxxxx.com/upload',
    filePath: res.tempFilePath,
    name: 'files',
    header: {
      "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
    },
    formData: {},
    success: function (res) {

      let img = "list[" + index + "].fileList"
      var fileList = that.data.list[index].fileList;
      fileList.push({ url: res.tempFilePath})

      let imgs = that.data.list[index].imgData;
      imgs.push(JSON.parse(res.data).data[0])
      let image = "list[" + index + "].imgData"

      that.setData({
        [image]: image,
        [img]: fileList
      })

    },
    fail: function (res) {}
  })
},

第五步:删除图片

deleteImg (e) {
  let that = this
  let index  = e.currentTarget.dataset.index 
  let idx = e.currentTarget.dataset.k


  let fileList = this.data.list[index].fileList
  fileList.splice(idx, 1)
  let file = "list[" + index + "].fileList"

  let imgs = this.data.list[index].imgData
  imgs.splice(idx, 1)
  let img = "list[" + index + "].imgData"

  this.setData({
    [file]:fileList,
    [img]: fileLists,
  })
},

图片上传前验证

一定要记得加 use-before-read 哦。

<van-uploader 
    max-count="1" 
    file-list="{{ fileList }}" 
    use-before-read 
    bind:before-read="beforeRead" 
    multiple="{{false}}" 
    upload-text='上传图片' 
/>

判断大小不能超过10M ,通过file.size判断。

图片格式必须是.png和.jpg,通过file.url的后缀名判断。

beforeRead(event) {
  
  const { file, callback } = event.detail;
  console.log(file)

  if (file.size > 10 * 1024 * 1024) {
    wx.showToast({
      title: '文件大小不能超过 10M!',
      icon: 'none'
    })
    callback(false);
  }

  let name = file.url.substring(file.url.lastIndexOf("."));

  if (name != '.png' && name != '.jpg') {
    wx.showToast({
      title: '图片必须是 .png 或 .jpg!',
      icon: 'none'
    })
    callback(false);
  }

  callback(true)
},

file的值

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

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

相关文章

【易忽视】方程两边同时平方会改变方程的解吗?【简洁证明】

问题提出 在做一道题的时候有这样一步&#xff1a;两边平方&#xff0c;最后求解&#xff0c;题很简单&#xff0c;但是这个方法是否能这么用引起了我的好奇。 思考 首先不妨假设一个通用的方程&#xff1a; f(x)g(x)f(x)g(x)f(x)g(x) 然后我们对方程两边平方&#xff1a; …

深度学习基础与线性回归实例

1、机器学习基础-线性回归 介绍&#xff1a;这是一个教育对收入影响的数据&#xff0c;从图像的走势来看&#xff0c;它是具有一个线性关系&#xff0c;即受教育年限越长收入越高&#xff0c;这样我们可以通直线来抽象出它们的关系。 接下来&#xff0c;我们将会介绍一些方法&…

Java中线程的状态

Java中线程的状态操作系统中线程的状态Java中线程的状态线程状态枚举类操作系统中线程的状态 从操作系统层面来看&#xff0c;线程通常有以下五种状态&#xff0c;前三种是线程的基本状态。 【运行态】&#xff1a;进程正处在处理机上运行&#xff0c;在单处理机环境下&#…

【学习笔记39】获取DOM标签对象

获取DOM标签对象一、认识DOM二、获取非常规DOM(html head body)1、HTML2、head3、body三、获取常规DOM&#xff08;一&#xff09;按照类名、标签名和ID名获取标签1、类名(伪数组)2、标签名(伪数组)3、ID名(唯一性)&#xff08;二&#xff09;按照选择器获取标签1、querySelect…

《人月神话》(The Mythical Man-Month)1 看清问题的本质:如果我们想解决问题,就必须试图先去理解它...

第一章 焦油坑&#xff08;The Tar Pit&#xff09;史前史中&#xff0c;没有比巨兽在焦油坑中垂死挣扎的场面更令人震撼的了。上帝见证着恐龙、猛犸象、剑齿虎在焦油中挣扎。它们挣扎得越是猛烈&#xff0c;焦油纠缠得越紧&#xff0c;没有任何猛兽足够强壮或具有足够的技巧&a…

IDEA注释配置程序员信息(带完整截图步骤,超级详细)

1.配置类注释的程序员信息 效果图 配置截图 模板 &#xff08;可根据需要进行位置调整及个数删除&#xff09; /***BelongsProject: ${PROJECT_NAME}*BelongsPackage: ${PACKAGE_NAME}*ClassName ${NAME}*Author: XUXIAN*CreateTime: ${YEAR}-${MONTH}-${DAY} ${HOUR}:${MINU…

这可能是最权威、最全面的Go语言编码风格规范了!

每种编程语言除了固定的语法之外&#xff0c;都会有属于自己的地道的(idiomatic)写法。其实&#xff0c;自然语言也不例外&#xff0c;你想&#xff0c;你用心想想是不是这样。语言的设计者们希望开发人员都能编写统一风格的地道的代码&#xff0c;这样不仅代码可读性好&#x…

细分图中的可到达节点 : 常规最短路运用题

题目描述 Tag : 「最短路」、「单源最短路」、「Dijkstra」、「SPFA」 给你一个无向图&#xff08;原始图&#xff09;&#xff0c;图中有 n 个节点&#xff0c;编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链&#xff0c;每条边之间的新节点数各不相同。 图用…

[前端框架]-VUE(上篇)

Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0…

链表经典算法题目

1.回文链表 编写一个函数&#xff0c;检查输入的链表是否是回文的。 示例 1&#xff1a; 输入&#xff1a; 1->2 输出&#xff1a; false 示例 2&#xff1a; 输入&#xff1a; 1->2->2->1 输出&#xff1a; true 笔试的写法 重点是快速code,不考虑空间复杂度…

蒙特卡洛法(Monte Carlo)电动汽车负荷预测matlab程序设计

电动汽车充电负荷的时间分布预测 规模化电动汽车充电负荷在未来某一天随时间特性的分布规律是研究电动汽车发展对配 电网影响以及充电站选址定容问题的前提与基础。电动汽车充电负荷的分布情况与车主的行 为特征有关&#xff0c;不同类型的电动汽车车主出行规律以及充电习惯不…

<Linux系统复习>信号

一、本章重点 1、什么是信号&#xff1f; 2、查看信号列表 3、信号捕捉 4、信号产生的5种方式 5、介绍CoreDump 6、信号处理的方式 7、如何理解信号产生到处理的过程 8、sigpending、sigprocmask、sigaction函数的使用 9、信号处理的时机 10、SIGCHLD信号 11、可重入函数 01 什…

Codeforces Round 836 (Div. 2) A - C

A:SSeeeeiinngg DDoouubbllee 题意&#xff1a;给定一个字符串&#xff0c;每个字符串的字符可以出现两次&#xff0c;要求通过重新排列构造一个回文串。 思路&#xff1a;直接暴力可以&#xff0c;每个字符头部一个尾部一个。 #include<cstdio> #include <iostream…

不使用实体类的情况下接收SQL查询结果、@Autowired注入为null解决

目录 一、场景 二、环境 三、使用 1、数据库表以及数据准备 2、项目导入必要依赖 3、添加连接数据库配置文件 4、编写测试方法 5、执行结果 四、将SQL单独提取出来 2.1 定义查询接口方法 2.2 测试 2.3 测试结果 五、问题记录&#xff1a; Autowired注入失败/null的…

b、B、KB、Kib、MB、MiB、GB、GiB、TB、TiB的区别

1024这个数字&#xff0c;想必计算机行业从业人员应该不会陌生&#xff0c;甚至10月24日还被当做程序员日&#xff0c;如果你问一个程序员1GB等于多少MB,他大概率会不假思索回答:1024。 没错&#xff0c;对于稍微对计算机或者网络有了解的人&#xff0c;一般都认为1024是数据容…

最短路算法 - dijkstra

最短路算法 - dijkstra1. 算法介绍2. 实战2.1 Reachable Nodes In Subdivided Graph3 参考1. 算法介绍 算法目的&#xff1a;求图中某点 s 到其余各点的最短距离 算法步骤&#xff1a; 初始化距离数组 dis 和优先级队列&#xff0c;其中 dis[i] 表示 s 点到当前 i 点的最短距…

树莓派上搭建SVN服务器

目录 一、服务端安装步骤 1.安装svn 2.创建目录 3.创建版本仓库 4.修改配置&#xff08;authz,passwd,svnserve.conf&#xff09; 5.启动服务 二、tortoisSVN客户端安装 三、结束 一、服务端安装步骤 1.安装svn sudo apt-get install subversion 2.创建目录 sudo m…

品RocketMQ 源码,学习并发编程三大神器

这篇文章&#xff0c;笔者结合 RocketMQ 源码&#xff0c;分享并发编程三大神器的相关知识点。 1 CountDownLatch 实现网络同步请求 CountDownLatch 是一个同步工具类&#xff0c;用来协调多个线程之间的同步&#xff0c;它能够使一个线程在等待另外一些线程完成各自工作之后&…

selenium--获取页面信息和截图

获取页面信息namecurrent_urltitlecurrent_window_handlewindow_handlespage_source简单用法—— 判断页面截图1.get_screenshot_as_png2.get_screenshot_as_file获取页面信息 主要方法如下图&#xff1a; 介绍一下常用的方法&#xff1a; name 获取浏览器名字 current_u…

Packet Tracer 实验 - 排除多区域 OSPFv3 故障

地址分配表 设备 接口 IPv6 全局单播地址 IPv6 本地链路地址 默认网关 ISP GigabitEthernet0/0 2001:DB8:C1:1::1/64 FE80::C1 不适用 ASBR GigabitEthernet0/0 2001:DB8:C1:1::2/64 FE80::7 不适用 Serial0/0/0 2001:DB8:A8EA:F0A::1 FE80::7 不适用 S…