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 相关文章推荐
文本框回车提交与禁止提交示例
Sep 27 Javascript
css样式标签和js语法属性区别
Nov 06 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
Jun 05 Javascript
Jquery异步提交表单代码分享
Mar 26 Javascript
javascript实现tab切换特效
Nov 12 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
Mar 06 Javascript
微信小程序 Video API实例详解
Oct 02 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
Nov 30 Javascript
react路由配置方式详解
Aug 07 Javascript
200行HTML+JavaScript实现年会抽奖程序
Jan 22 Javascript
详解小程序如何避免多次点击,重复触发事件
Apr 08 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
Aug 27 jQuery
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二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
PHP滚动日志的代码实现
2015/06/10 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
2016/06/13 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
jqGrid jQuery 表格插件测试代码
2011/08/23 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
JavaScript中实现依赖注入的思路分享
2015/01/15 Javascript
jquery实现无限分级横向导航菜单的方法
2015/03/12 Javascript
javascript对象的创建和访问
2016/03/08 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
浅谈javascript中的 “ &amp;&amp; ” 和 “ || ”
2017/02/02 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
python中global用法实例分析
2015/04/30 Python
深入浅出学习python装饰器
2017/09/29 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
Django的用户模块与权限系统的示例代码
2019/07/24 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
python中os.remove()用法及注意事项
2021/01/31 Python
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
网络工程师个人的自我评价范文
2013/10/01 职场文书
简单租房协议书
2014/10/21 职场文书
婚礼新人答谢词
2015/01/04 职场文书
售票员岗位职责
2015/02/15 职场文书
英语辞职信范文
2015/02/28 职场文书
详解Vue router路由
2021/11/20 Vue.js