el-upload子组件上传多张图片(上传为files或base64url)

news2024/11/19 5:53:27

场景:

在表单页,有图片需要上传,表单的操作行按钮中有上传按钮,点击上传按钮。

弹出el-dialog进行图片的上传,可以上传多张图片。

由于多个表单页都有上传多张图片的操作,因此将上传多图的el-upload定义为公共的子组件。

效果如图:

util.js图片转base64

使用到的工具js,file转url

util.js图片转base64

// 转base64  el-upload上传的file 不能直接用,要用file.raw
// 文件对象转base64
export  function getBase64Url (file) {
	return  new Promise ((resolve,reject) =>{
			  const reader = new FileReader(); //实例化文件读取对象
			  reader.readAsDataURL(file.raw); //将文件读取为 DataURL,也就是base64编码
			 reader.onload = function () {
				resolve(reader)
			 }
			 reader.onerror = function (error) {
				reject(error)
			 }
	
	})
   
}

父组件代码

<el-dialog :visible.sync="showUploadDialog" :modal="false" title="上传图片" width="30%">
		<div style="width:80%;height:80%;justify-content:center;align-items:center;text-align:center;display:flex">
                <div style="margin-bottom:20px;" >
                        <upload-many ref="imgUpload" :data="getChildParam('1','正面照')" @getUploadChildData="getUploadChildData"></upload-many >
                        <el-button type="primary" style="margin-top:10px" @click="uploadRouteImgList" size="mini">提交图片</el-button>

                </div>
        </div>
</el-dialog>

//定义的data 省略样式。。。。
showUploadDialog:false,//默认false 点击上传 设置为true
uploadRowObj:{},//要上传的对象

// methods 方法 省略样式。。。。
getChildParam(type,title){
	var obj = new Object();
	obj.type = type;
	obj.title = title;
    // 当子组件需要回显已经有的图片时,应该给fileList赋值
	obj.fileList =[];
    // 模拟赋值 用于回显
    // 假设 this.dbImgUrlList 这是数据库返回的base64 url 算有base64前缀

    if(this.dbImgUrlList.length>0){
        for(var i=0;i<this.dbImgUrlList.length;i++){
            obj.fileList.push({id:i,url:this.dbImgUrlList[i],name:'img'+i+'.png'})
        }

    }
    
	obj.commonImgList=[];
 
	return obj;
 
},

 
//接收子组件上传的base64格式的图片url,赋值给想传给后端的对象
getUploadChildData(obj){
     // 这个是files
	 this.uploadRowObj.routeImgList = obj.commonImgList;
      // 这个是每张图片的base64url 数组
     this.uploadRowObj.imgUrlArr =  obj.imgUrlArr ;
 },
 
//下面写了两种方法,可按需用其中一种
async uploadRouteImgList (){
    if(this.uploadRowObj.routeImgList.length>0){
        // 第一种 上传files到后端 后端接收为 @RequestParam("id") String id,@RequestParam("files") MultipartFile[] files  

        let formData = new FormData();
        this.uploadRowObj.routeImgList.forEach(file=>{
            formData.append("files",file);
        })
        formData.append("id", this.uploadRowObj.id);
         
        const {code,message,data} = await uploadImg(formData)
        if(code === '0'){
            this.$message.success("上传成功");
            this.showUploadDialog = false;
        }

        // 第二种  上传的是对象 对象含id和base64Url的数组 (在子组件中 url去除了base64标识的前缀)
        const {code,message,data} = await uploadImg(this.uploadRowObj)
        if(code === '0'){
            this.$message.success("上传成功");
            this.showUploadDialog = false;
        }

    }else{
        this.$message.error("上传图片不能为空")
    }

}

子组件代码

 
<template>
	<div>
	<!-- 上传多张图片的公共组件 limit可以子组件动态传不同的值过来 :file-list="data.fileList" 可以回显-->
	<el-upload action="#" 
		accept="image/**" 
        :limit="10" :multiple="true" :auto-upload="false"
		list-type="picture-card" 
        :file-list="data.fileList" 
        :on-change="changeUpload"
		:before-upload="handleBeforeUpload"
		:on-remove="imgRemove"
		:show-file-list="true"
        >
		
		<i class="el-icon-plus"></i>
	</el-upload>
 
	</div>
 </template>
 
 
 <script>
 
 import  {getBase64Url} from '@/api/utils.js'
 
 export default {
	name:"upload",
	props:{
        data:{
            type: Object,
            default:()=>{return {} }
        },
    },
    
	data(){
		return {
			fileList:[],
            imageList:[],
			hideUpload:false,
			imgVisible:false,
			imgUrl:'',
			onChangeImgUrl:'',
            type:'',
            imgUrlArr:[],
		}
	},
    mounted(){
       
       
    },
	 
	methods:{
       
		//上传基本校验
		handleBeforeUpload(file,type){
			var img = file.name.substring(file.name.lastIndexOf('.') + 1)
			const suffix = img === 'jpg'
			const suffix2 = img === 'png'
			const suffix3 = img === 'jpeg'
			const isLt1M = file.size / 1024 / 1024 < 1;
			if (!suffix && !suffix2 && !suffix3) {
				this.$message.error("只能上传图片!");
				return false
			}
			// 可以限制图片的大小
			if (!isLt1M) {
				this.$message.error('上传图片大小不能超过 1MB!');
			}
			return suffix || suffix2 || suffix3
		},
		
		//上传后 删除
		async imgRemove(file ,fileList){
			
			var parentObj = this.data;
            //删除后更新了传给父组件的图片file集合
		    parentObj.commonImgList= fileList;
            this.imgUrlArr =[];
            //删除后更新了传给父组件的图片base64url集合 
            for (let fileTemp of fileList) {
                    // 父组件如果传了回显的list 
                    
                    if(!fileTemp.raw){//这是回显的获取base64 url
                       var res = fileTemp.url.replace(/^data:image\/\w+;base64/,"");
                       this.imgUrlArr.push(res);
                    }else{// 这是刚刚上传的获取base64 url
                        const response = await getBase64Url(fileTemp);
                        var res = response.result;
                        res = res.replace(/^data:image\/\w+;base64/,"");  
                        this.imgUrlArr.push(res);
                    }
                    
            }
            parentObj.imgUrlArr = this.imgUrlArr;
            // 传给父组件方法
			this.$emit("getUploadchildData", parentObj);
		},
	
		//上传控件的改变事件 提交到父组件
		async changeUpload(file, fileList){
			
			var parentObj = this.data;
            //删除后更新了传给父组件的图片file集合
		    parentObj.commonImgList= fileList;
			
			//多张图片都转base64 这是需要base64的情况下
			 for (let fileTemp of fileList) {
                    // 父组件如果传了回显的list 
                    
                    if(!fileTemp.raw){//这是回显的获取base64 url
                       var res = fileTemp.url.replace(/^data:image\/\w+;base64/,"");
                       this.imgUrlArr.push(res);
                    }else{// 这是刚刚上传的获取base64 url
                        const response = await getBase64Url(fileTemp);
                        var res = response.result;
                        res = res.replace(/^data:image\/\w+;base64/,"");  
                        this.imgUrlArr.push(res);
                    }
                    
            }
            // 所有图片的base64 url集合
            parentObj.imgUrlArr = this.imgUrlArr;
			
			 
			this.$emit("getUploadchildData", parentObj);
		}
	
	}
}
 </script>
 
 <style  >
 .img{
    width: 60%;
    height: 80;
    margin: 0 auto;
    display: flex;
    justify-content: center;
    align-items: center;
 }
 </style>

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

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

相关文章

6、基于机器学习的预测

应用机器学习的任何预测任务与这四个策略。 文章目录 1、简介1.1定义预测任务1.2准备预测数据1.3多步预测策略1.3.1多输出模型1.3.2直接策略1.3.3递归策略1.3.4DirRec 策略2、流感趋势示例2.1多输出模型2.2直接策略1、简介 在第二课和第三课中,我们将预测视为一个简单的回归问…

Python开源项目周排行 2024年第3周

ython 趋势周报&#xff0c;按周浏览往期 GitHub,Gitee 等最热门的Python开源项目&#xff0c;入选的项目主要参考GitHub Trending,部分参考了Gitee和其他。排名不分先后&#xff0c;都是当周相对热门的项目。 入选公式&#xff1d;70%GitHub Trending20%Gitee10%其他 关注微…

K8S-NFS-StorageClass

工作流程 K8s中部署NFS-StorageClass K8s的StorageClass提供了为集群动态创建PV的能力。 1.部署NFS服务 2.选择NFS的Provinisoner驱动 K8S中没有内置的NFS的制备器&#xff0c;而定义StorageClass的时候需要指定制备器&#xff08;Pervisioner&#xff09;,所以需要&#xf…

Pycharm Community 配置调试Behave

前提&#xff1a;python小白&#xff0c;临时搞python项目&#xff0c;公司限制使用Pycharm版本&#xff0c;故只能使用社区版&#xff0c;然而官方有明确说明&#xff1a;只有Professional版支持Behave。故研究了半天才整清楚社区版调试Behave的设置 没有进行下面的步骤之前&…

C++面试宝典第26题:螺旋矩阵

题目 给你一个正整数n,生成一个包含1到n的平方的所有元素,且元素按顺时针顺序螺旋排列成n x n的正方形矩阵。 示例: 输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]] 解析 螺旋矩阵是指按照顺时针(或逆时针)螺旋顺序排列元素的二维矩阵。比如:给定一个如下的3x3矩阵,按顺…

PSoc62™开发板之WDT应用

看门狗 看门狗定时器(WDT)是一种硬件定时器&#xff0c;在出现意外固件时自动复位设备执行路径。如果启用了WDT&#xff0c;则必须在固件中定期进行服务&#xff0c;以避免复位。否则&#xff0c;计时器失效并产生一个设备复位。此外&#xff0c;WDT可以用作中断源或在低功耗唤…

正点原子--STM32定时器学习笔记(1)(更新中....)

F1系列基本定时器&#xff08;TIM6 / TIM7&#xff09; 我们的目标是通过TIM6基本定时器定时500ms&#xff0c;让LED0每隔500ms闪一下&#xff01; 思路&#xff1a;使用定时器6&#xff0c;实现500ms产生一次定时器更新中断&#xff0c;在中断里执行“翻转LED0”。 定时器什…

2024021期传足14场胜负前瞻

2024021期赛事由亚洲杯2场、英超5场&#xff0c;德甲6场、非洲杯1场组成。售止时间为2月3日&#xff08;周六&#xff09;19点00分&#xff0c;敬请留意&#xff1a; 本期1.5以下赔率3场&#xff0c;1.5-2.0赔率3场&#xff0c;其他场次基本皆是平半盘、平盘。本期14场整体难度…

第三百零三回

文章目录 1. 概念介绍2. 实现方法2.1 文字信息2.2 红色边框 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何实现密码输入框"相关的内容&#xff0c;本章回中将介绍如何在在输入框中提示错误.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们…

LabVIEW CVT离合器性能测试

介绍了CVT&#xff08;连续变速器&#xff09;离合器的性能测试的一个应用。完成了一个基于LabVIEW软件平台开发的CVT离合器检测与控制系统&#xff0c;通过高效、准确的测试方法&#xff0c;确保离合器性能达到最优。 系统采用先进的硬件配合LabVIEW软件&#xff0c;实现了对…

python-自动化篇-运维-实现读取日志文件最后一行的时间

文章目录 1. 使用Python打开日志文件2.python读取文件最后一行两种方式3.读取当前时间&#xff0c;进行两者相减&#xff0c;超时报警4.将内容推送到企业微信5. 关闭日志文件整体代码 1. 使用Python打开日志文件 在开始实时读取日志文件之前&#xff0c;我们首先需要打开一个日…

深入了解键盘:分类、工作原理与操作指南

键盘 键盘是计算机使用的主要输入设备之一&#xff0c;键盘主要由创建字母、数字和符号并执行附加功能的按钮组成&#xff0c;通常用于向计算机或其他数字设备输入文本、命令和各种控制信号。 键盘是计算机中最重要的字符输入设备&#xff0c;其基本组成元件是按键开关&#…

画质和场景双需求下,海信电视U8KL的变与不变

又到一年春节&#xff0c;最近几年大家过年的方式越来越丰富&#xff0c;但是跟家人在一起看春晚依然是主流&#xff0c;电视也是过年不可或缺的家庭成员。 当然&#xff0c;随着大家对生活品质的要求更高&#xff0c;对电视的要求也变得更高了。比如&#xff0c;现在春晚直播…

ESP-IDF增加自定义组件开发过程记录

ESP-IDF增加自定义组件开发过程记录 记录一下&#xff0c;自定义组件开发方式容易实现代码的复用。比如说在实现一些芯片或者模块的代码上&#xff0c;网上先找找有的话就可以不用自己写了&#xff0c;实在没有的时候只能自己辛苦摸索编写了。 前言: 因为对cmake也不懂&…

纯血鸿蒙来了,鸿蒙App开发该如何提速

“全世界做产品挣钱的公司很多&#xff0c;但有能力打造操作系统的公司没有几家&#xff0c;最后世界上的操作系统就只有三套&#xff1a;鸿蒙、iOS和安卓。” --- 360集团创始人、董事长周鸿祎 “HarmonyOS实现了AI框架、大模型、设计系统、编程框架、编程语言、编译器等全栈…

Google Earth Engine tools——利用geetools中的algorithms算法实现hsv

简介 锐化HSV是一种图像处理技术&#xff0c;它是通过调整图像的颜色分量来增强图像的细节和清晰度。HSV是一种颜色空间模型&#xff0c;它基于人类视觉感知的方式来描述颜色。HSV代表色调&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#xff09;和明度&…

正点原子--STM32中断系统学习笔记(1)

1、什么是中断&#xff1f; 原子哥给出的概念是这样的&#xff1a;打断CPU正常执行的程序&#xff0c;转而处理紧急程序&#xff0c;然后返回原暂停的程序继续运行&#xff0c;就叫中断。 当发生中断时&#xff0c;当前执行的程序会被暂时中止&#xff0c;进而进入中断处理函…

Vector CANdb++ Editor和CANdb++ Admin的区别

目录 1 CANdb Editor和CANdb Admin的功能偏差 2 CANdb Program窗口 3 下载并安装CANdb Editor和CANdb Admin 3.1 安装CANdb Admin.J1939 3.0 SP27 优质博文推荐阅读&#xff08;单击下方链接&#xff0c;即可跳转&#xff09;&#xff1a; Vector工具链 CAN Matrix DBC …

解析Excel文件内容,按每列首行元素名打印出某个字符串的统计占比(超详细)

目录 1.示例&#xff1a; 1.1 实现代码1&#xff1a;列数为常量 运行结果&#xff1a; 1.2 实现代码2&#xff1a;列数为变量 运行结果&#xff1a; 1.示例&#xff1a; 开发需求&#xff1a;读取Excel文件&#xff0c;统计第3列到第5列中每列的"False"字段占…

Linux VLAN相关概念、转发原理及处理流程

背景 二、三层转发是网络工程师经常接触到的一个问题&#xff0c;VLAN配置是二、三层转中一个很重要的概念&#xff0c;在配置VLAN的情况下&#xff0c;内核对报文是如何处理的呢&#xff1f; 概念 了解VLAN转发&#xff0c;首先必须知道VLAN相关概念&#xff1b; VLAN作用 V…