vue 图片裁剪上传组件的实现


Posted in Javascript onNovember 12, 2020

先看一下总体效果:

上传文件做了大小和类型的限制,在动图中无法展现出来。

vue 图片裁剪上传组件的实现

使用file类型的input实现选择本地文件

但是浏览器原生的文件上传按钮的颜值不尽人意,而且按钮上的文字是无法改变的,我需要把这个上传文件的按钮改造一下。

  • 方法1:使用label元素来触发一个隐藏的file类型的 input元素;(缺点:在多人开发时,可能出现重复的元素id,导致难以预料的bug)
<input type="file" id='up_file_input' v-show='false' >
<label for='up_file_input'></label>
  • 方法2:或者在这个label元素的click事件函数中手动触发文件上传按钮的click事件。
<input type="file" v-show='false' ref="inputFileUp" >
<label @click='$refs.inputFileUp.click()'></label>

使用input的change事件获取选择的本地图片并进行校验

上传图片的校验规则及提示语由父组件通过 prop 传递给子组件,格式如下:

const img_valit = {
 type: /^.*\.(jpg|png|jpeg)$/i, // 文件格式校验
 type_error_msg: '上传头像图片只能是 jpg 或者 png 格式!',
 size: 3, // 文件大小校验
 size_error_msg: '上传的图片大小不能超过3MB'
}

这里需要注意: 需要在上传文件按钮的click事件中手动清空这个文件类型输入框的值,解决选择和上次相同的文件之后无法触发 change事件的问题

function fileInputClick(event) {
  event.target.value = "";
}
function coverImgChange(event) {
   const file = event.target.files[0];
   // 在组件的自定义属性中定义一个变量 originalFile 来保存当前上传的文件
   this.$options._myOpt.originalFile = file;
   // 获取对文件的校验规则
   const { type, size, type_error_msg, size_error_msg } = this.img_valit;
   // 校验文件类型和文件大小
   const isJPG_PNG = type.test(file.name), isLt5M = file.size / 1024 / 1024 <= size;
   !isLt5M && this.$message.error(size_error_msg);
   !isJPG_PNG && this.$message.error(type_error_msg);
   // 文件通过校验,打开裁剪弹窗
   if (isJPG_PNG && isLt5M) {
    this.cropImgUrl = window.URL.createObjectURL(file);
    this.dialogVisible = true;
   }
  }

打开弹窗进行图片裁剪

弹窗使用的 Element-UI 中的弹窗, 图片裁剪是第三方插件 vue-cropper。图片裁剪插件中的一些配置可以参考插件官方文档,下面的代码中省略了配置部分的代码。

<el-dialog :visible.sync="dialogVisible" width='800px' title="图片裁剪">
   <div class="dialog-content">
    <div class="cropper-image">
     <vue-cropper
      ref="cropper"
      :img="cropImgUrl"
      @realTime="realTime"
     ></vue-cropper>
    </div>
    <!-- 图片裁剪之后的预览 -->
    <div class="preview-wrapper">
     <div
      class="show-preview"
      :style="{'width': previews.w + 'px', 'height': previews.h + 'px', 'overflow': 'hidden'}"
     >
      <div :style="previews.div">
       <img :src="previews.url" class="preview_img" :style="[previews.img]">
      </div>
     </div>
     <p class="preview-text">裁剪结果预览</p>
    </div>
   </div>
   <div slot="footer" class="dialog-footer">
    <button @click="dialogEsc()">取 消</button>
    <button @click="dialogSure()">确 定</button>
   </div>
  </el-dialog>

向服务器发送请求上传图片

上传文件接口中,向后台发送请求的参数为 {image: 文件本身(File类型), filename: 文件名}

function realTime(data) {
  this.previews = data;
}
// 裁剪弹窗中确定按钮的点击事件
function dialogSure() {
   const ajaxConfig = {
    headers: {
     "Content-Type": "multipart/form-data"
    }
   };
   // 上传图片的文件名
   let cropFileName =
    this.$options._myOpt.originalFile.name.match(/([^\/]+)(?=\.)/gi)[0] ||
    Date.now().toString();
   this.$refs.cropper.getCropBlob(blob => {
   // IE 和 Edge 不支持 File 构造函数
    let cropFile = new File(
     [blob],
     cropFileName.toString() + "." + (this.cropperConfig.outputType || "jpg"),
     { type: blob.type }
    );
    let upParams = new FormData();
    upParams.append("image", cropFile);
    upParams.append("filename", cropFile.fileName);
    axios.post(this.up_action, upParams).then(({ data }) => {
     if (data.status === 0) {
      this.coverUlr = window.URL.createObjectURL(blob);
      this.pathToParent({
       fileId: data.result.fileId,
       fileExt: data.result.fileExt
      });
     } else {
      this.coverUlr = "";
      this.pathToParent({
       fileId: "",
       fileExt: ""
      });
     }
    });
   });
   this.dialogVisible = false;
  }
  // 向父组件传递上传文件成功之后后台返回的数据
  function pathToParent(filePath) {
   this.$emit("getFilePath", filePath);
  }

以上就是vue 图片裁剪上传组件的实现的详细内容,更多关于vue 图片裁剪上传组件的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
Apr 01 Javascript
Javascript的时间戳和php的时间戳转换注意事项
Apr 12 Javascript
Javascript显示和隐藏ul列表的方法
Jul 15 Javascript
jQuery简单实现仿京东商城的左侧菜单效果代码
Sep 09 Javascript
学习javascript面向对象 理解javascript原型和原型链
Jan 04 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
Sep 24 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
Jul 13 Javascript
微信小程序实现弹出菜单
Jul 19 Javascript
javascript实现视频弹幕效果(两个版本)
Nov 28 Javascript
推荐几个不错的console调试技巧实现
Dec 20 Javascript
Vue中fragment.js使用方法小结
Feb 17 Javascript
使用typescript快速开发一个cli的实现示例
Dec 09 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
Nov 12 #Javascript
使用Vant完成DatetimePicker 日期的选择器操作
Nov 12 #Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
Nov 11 #Javascript
vant 中van-list的用法说明
Nov 11 #Javascript
让Vue响应Map或Set的变化操作
Nov 11 #Javascript
vue项目中使用rem,在入口文件添加内容操作
Nov 11 #Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
Nov 11 #Javascript
You might like
php的正则处理函数总结分析
2008/06/20 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
2017/12/31 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
纯javascript实现选择框的全选与反选功能
2019/04/08 Javascript
python多线程http下载实现示例
2013/12/30 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
Python hmac模块使用实例解析
2019/12/24 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
2018/11/30 HTML / CSS
使用html2canvas实现浏览器截图的示例代码
2018/01/26 HTML / CSS
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
Python面试题:Python是如何进行内存管理的
2014/08/04 面试题
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
怎样填写就业意向
2014/04/02 职场文书
传承焦裕禄精神思想汇报2014
2014/09/10 职场文书
个人授权委托书模板
2014/09/14 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
2015年采购部工作总结
2015/04/23 职场文书
捐款仪式主持词
2015/07/04 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
如何才能写好调研报告?
2019/07/03 职场文书