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. 处理时间的类 —— System类、Date类 、SimpleDateFormat类 与 Calendar类

    在我们以往的编程中,就有过通过运行前和运行后时间差来判断时间复杂度的例子,再扯得远一点,我们在C语言中制造随机数的操作,也要用到有关时间的函数.而且,在我们未来的编程中,也会时不时要用到能够读取当前时 ...

  2. Java 多线程 -- volatile 山寨版的synchronized

    在 多线程中,每个线程会把数据从主内存中拷贝到自己的工作内存中,当线程完成计算后,再把工作内存的数据更新到主内存中,或者当主内存主数据有更新是,线程会去主内存取最新数据.但是,当线程特别忙时,就不会去 ...

  3. 测试Thread中的常用方法

    package com.yhqtv.java; /* *测试Thread中的常用方法: * 1.start():启动当前线程:调用当前线程的run() * 2.run():通常需要重写Thread类的 ...

  4. 在Spring Boot中加载初始化数据

    文章目录 依赖条件 data.sql文件 schema.sql 文件 @sql注解 @SqlConfig 注解 在Spring Boot中加载初始化数据 在Spring Boot中,Spring Bo ...

  5. Linux系统curl获取公网ip

    收集了几个查询当前公网ip的网址,可以通过curl命令方便的查看 curl cip.cc curl ipinfo.io curl myip.ipip.net curl http://members.3 ...

  6. 基于jenkins自动打包并部署docker环境

    一.实验环境 git                      192.168.200.71 jenkins    192.168.200.72 docker               192.16 ...

  7. Redis数据迁移的三个方法

    为什么80%的码农都做不了架构师?>>>   1. rdb数据备份恢复方法 redis 127.0.0.1:6379> SAVE OK 或者 redis-cli -h 127. ...

  8. 阿里大牛带你深入分析spring事务传播行为

    spring框架封装了很多有用的功能和组件,便于在项目开发中快速高效的调用,其中spring的事务使用非常简单,只需要在用到事务的地方加一行注解即可: 1@Transactional 但越是看起来简单 ...

  9. idea jdk版本切换

    为什么80%的码农都做不了架构师?>>>   打开file-peoject structure,或者 改完project后,点击models里面的sources 和dependenc ...

  10. Tomcat的设置4——Tomcat的体系结构与设置基于端口号的虚拟主机

    一.Tomcat体系结构 从conf/server.xml可体现Tomcat的体系.一个Server可有多个service,一个service可以有多个连接器connector,每个连接器暴露出不同的 ...