ElementUI 中的el-upload 上传图片 我进行了二次封装。(默认大家都是有一定的vue基础的,细节就不过多的讲了)

在项目中我们主要拿到图片或者其他的一些参数 ,我这里是上传后返回的Guid

所以上传的动作我就集中处理了,像 input 的 v-model 直接获取到参数

页面展示代码:

   <imgeFile v-model="form.license" allclass="passport-uploader"
inclass="passport-uploader-icon passport-s3" onclass="passport passport-pic">
<div class="el-upload__tip" slot="tip">请上传300*420像素不超过500K大小的图片,图片格式支持.PNG或.JPG</div>
</imgeFile>

效果:

组件代码:

<template>
<el-upload :class="allclass" :accept="accept" :action="fileUrl" :show-file-list="false"
:on-success="handlePassportSuccess" :before-upload="beforePassportUpload">
<!---上传图片后的展示效果 imge是进行封装过的 imageUrl是Guid 统一处理--->
<imge v-if="imageUrl" :src="data:imageUrl" :class="onclass"/>
<!---上传图片前的展示效果--->
<i v-else :class="inclass"></i>
<!---提示--->
<slot name="tip" slot="tip"></slot>
</el-upload>
</template> <script> import { Url, CCONFIG} from "@/api/apiconfig";//上传图片地址
import {getFileUrl} from "@/api/upload"; //获取图片方法
export default {
model:{
prop:"value",
},
props: {
//配合v-model 加载初始值
value: {
type: String,
default: ""
},
//大于多少兆开始压缩
sizeKB:{
type:Number,
default: 100
},
//最大多少兆
maxSizeM:{
type:Number,
default: 5
},
//图片同比压缩比列
scale:{
type:Number,
default: 0.3
},
//上传文件类型
accept:{
type: String,
default: "image/jpeg,image/png"
}, //整体样式
allclass: {
type: String,
default: "passport-uploader-logo"
},
//点击前样式
inclass: {
type: String,
default: "el-icon-plus avatar-uploader-icon"
},
//点击后样式
onclass: {
type: String,
default: "passport-logo"
}, },
data() {
return {
fileUrl: Url.imge_Upload,//上传服务器地址
imageUrl: "",
filelist:[],
};
},
   //监听父组件值是否在变化
      watch: {
        //有些页面初始初始src没有赋值
        value(newValue, oldValue){
              this.imageUrl= newValue;
           },
      },
    computed: {},
created: function () {
this.imageUrl=this.value
},
mounted() {
},
methods: {
//上传成功返回值
handlePassportSuccess(res, file) {
if (res.code == "0000") {
this.imageUrl=res.data.id;
//返回 v-model的参数(关键)
this.$emit('input', res.data.id)
} else
this.imageUrl = "";
}, //压缩图片 下面的代码都是压缩文件大小
beforePassportUpload(file) {
var that = this;
return new Promise((resolve, reject) => {
const isJPG = file.type === "image/jpeg";
const isPNG = file.type === "image/png";
const kb= file.size/ 1024;
const sizeM= file.size/ 1024/1024;
const isLtKB = kb < this.sizeKB;
let bool = false;
let msg = "";
if ((isJPG || isPNG)&&sizeM<=this.maxSizeM) {//判断是否符合格式要求
bool = true;
}
else
if(sizeM>this.maxSizeM){
var mag="上传文件必须是小于"+this.maxSizeM+"M";
this.$message({message:mag,type:'error',offset:10 });
reject(file);
} else
{
this.$message({message:"上传文件必须是jpg、png格式!",type:'error',offset:10 });
reject(file);
}
if (bool && !isLtKB) {//如果格式符合要求,但是size过大,对图片进行处理
let image = new Image(),
resultBlob = "";
image.src = URL.createObjectURL(file);
image.onload = () => {
resultBlob = that.compressUpload(image);//Blob
resolve(resultBlob);
};
} else if (bool && isLtKB) {
resolve(file);//file
}
});
},
compressUpload(image) {
let canvas = document.createElement("canvas");//创建画布元素
let ctx = canvas.getContext("2d");
let initSize = image.src.length;
let { width } = image,
{ height } = image;
canvas.width = width;
canvas.height = height;
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(image, 0, 0, width, height);
let compressData = canvas.toDataURL("image/jpeg", this.scale); //等比压缩
let blobImg = this.dataURItoBlob(compressData);//base64转Blob
return blobImg;
},
dataURItoBlob(data) {
let byteString;
if (data.split(",")[0].indexOf("base64") >= 0) {
byteString = atob(data.split(",")[1]);//转二进制
} else {
byteString = unescape(data.split(",")[1]);
}
let mimeString = data
.split(",")[0]
.split(":")[1]
.split(";")[0];
let ia = new Uint8Array(byteString.length);
for (let i = 0; i < byteString.length; i += 1) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ia], { type: mimeString });
}, }, };
</script>

QQ交流群:929412850 希望大家一起能够探讨学习

封装组件el-upload通过v-model (一): 上传单张图片的更多相关文章

  1. TagHelper+Layui封装组件之Radio单选框

    TagHelper+Layui封装组件之Radio单选框 标签名称:cl-radio 标签属性: asp-for:绑定的字段,必须指定 asp-items:绑定单选项 类型为:IEnumerable& ...

  2. Vue 爬坑之路(九)—— 用正确的姿势封装组件

    迄今为止做的最大的 Vue 项目终于提交测试,天天加班的日子终于告一段落... 在开发过程中,结合 Vue 组件化的特性,开发通用组件是很基础且重要的工作 通用组件必须具备高性能.低耦合的特性 为了满 ...

  3. 【ExtJS】关于标准模块化封装组件

    在此之前,自己封装自定义控件用的是这样的方式: Ext.define('My.XXX',{ extend: 'Ext.YYY', xtype: 'ZZZ', . . . items:[ ... ] } ...

  4. AntD框架的upload组件上传图片时使用customRequest方法自定义上传行为

    本次做后台管理系统,采用的是 AntD 框架.涉及到图片的上传,用的是AntD的 upload 组件. 我在上一篇文章<AntD框架的upload组件上传图片时使用customRequest方法 ...

  5. react第七单元(组件的高级用法-组件的组合(children的用法)-高阶组件-封装组件)

    第七单元(组件的高级用法-组件的组合(children的用法)-高阶组件-封装组件) #受控组件 简而言之,就是受到状态state控制的表单,表单的值改变则state值也改变,受控组件必须要搭配onc ...

  6. 基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用

    我前面几篇随笔介绍了关于几篇关于SqlSugar的基础封装,已经可以直接应用在Winform项目开发上,并且基础接口也通过了单元测试,同时测试通过了一些Winform功能页面:本篇随笔继续深化应用开发 ...

  7. [Web API] Web API 2 深入系列(6) Model绑定(上)

    目录 解决什么问题 Model元数据解析 复杂类型 ValueProvider ValueProviderFactory 解决什么问题 Model: Action方法上的参数 Model绑定: 对Ac ...

  8. 091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 01 static关键字(上)

    091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  9. vue 自定义封装组件 使用 model 选项

    自定义组件的 v-model 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框.复选框等类型的输入控件可能会将 value 特性用于不同 ...

随机推荐

  1. 2007 NOIP T1奖学金

    奖学金(07NOIPT1): [题目描述] 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果 ...

  2. vue2.x学习笔记(九)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12577948.html. 数组的更新检测 数组在javascript是一种特殊的对象,不是像普通的对象那样通过Ob ...

  3. 高校战“疫”网络安全分享赛 Misc ez_mem&usb

    打开之后是一个流量包 用wireshark导出HTTP文件,有个upload,用一下binwalk,出来了一个镜像文件 用volatility搜一下,命令里有一个密码,看见了但是后来给忘了... 文件 ...

  4. C# 基础知识系列- 13 常见类库介绍(一)

    0. 前言 每篇一个前言,介绍一下这一篇的内容.之前的内容都是针对某些知识点进行的介绍,这篇内容介绍一下实际开发中常用的一些类和命名空间.这一篇是个连续剧,大概有个三四集.嗯,就是这样. 1. Sys ...

  5. Shelve:对象的持久化存储

    目的:Shelve模块为任意能够pickle的Python对象实现持久化存储,并提供一个类似字典的接口. 在关系型数据库还过于复杂的情境中,Shelve为你提供了Python对象持久化的另一种方案. ...

  6. SOCKET网络基础

  7. 获取 ProgramData 之类的环境变量(文件夹路径)的值

    GetEnvironmentVariable Recognized Environment Variables https://docs.microsoft.com/en-us/windows/dep ...

  8. linux uniq 命令实用手册

    Linux uniq 命令用于处理文本内容中的重复行. 这里我们只介绍其常用参数,其完整用法可参见man uniq. 例如,我们有如下文件内容: >>> cat log.txt __ ...

  9. java 之 构造器 static关键字

    构造器  特点: 方法名和类名一至,没有void没有返回,无参数的称为无参构造器,有参数的称为有参构造器 语法: public 类名 {数据类型 参数名} 目的:创建对象 注意:如果类中没有带有参数的 ...

  10. unix域源码解析

    首先我们先要创建一个用于通信的结构unix_proto_data ,并初始化某些字段 static int unix_proto_create(struct socket *sock, int pro ...