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. chrome Provisional headers are shown错误提示(转载)

    今天开发时遇到了一个问题,由于要做一个支付等待页,大概的意思就是点击支付之后,跳出来一个页面,告知用户正在跳转到支付页面.这个时候问题来了,指鹤要做的这个静态支付等待页中有图片,而为了要让这个静态页面 ...

  2. linux内核第一宏 container_of

    内核第一宏 list_entry()有着内核第一宏的美称,它被设计用来通过结构体成员的指针来返回结构体的指针.现在就让我们通过一步步的分析,来揭开它的神秘面纱,感受内核第一宏设计的精妙之处. 整理分析 ...

  3. Apache Hudi集成Apache Zeppelin实战

    1. 简介 Apache Zeppelin 是一个提供交互数据分析且基于Web的笔记本.方便你做出可数据驱动的.可交互且可协作的精美文档,并且支持多种语言,包括 Scala(使用 Apache Spa ...

  4. 前端开发--ajax

    使用ajax,他是有两个模块的,一个是客户端,一个是服务端. 客户端负责发送数据,发送数据的方式有两种,一种是GET,另一种是POST. 服务端是用来接收,处理数据和发送请求的数据. 要想使用ajax ...

  5. ThinkJS前端搭配vue时的Nginx配置

    Thinkjs 作为奇舞团开源的nodejs mvc框架之一,引起了很多NodeJS程序员的亲赖.但是其关于静态文件处理部分支持不够完善,主要是体现在SPA单页应用,之前在ThinkJS 2.*版本时 ...

  6. OpenCV学习(1)——初步接触

    一.介绍OpenCV           OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库.OpenCV是由英特尔公司发起并参与开 ...

  7. Linux中的常用符号

    >, 1>     输出重定向符stdout,代码为1,重定向内容到文件,清除已有的内容,然后加入新内容,如果文件不存在还会创建文件 >>, 1>>   追加输出重 ...

  8. mac OS mysql新建数据库运行sql文件

    mysql -uroot -proot123 进入本地数据库 create database 数据库名; use 数据库名; source 文件路径 quit 退出

  9. Git 常见问题汇总

    git reabse 合并多个commit git rebase -i HEAD~{NUM} git rebase -i start end 会进入一个指定区间的commit列表 根据提示进行文本编辑 ...

  10. DefaultSingletonBeanRegistry源码解析

    DefaultSingletonBeanRegistry是SingletionBean注册器的默认实现. 来学习下DefaultSingletonBeanRegistry的源码: package or ...