【vue+el-upload+vue-cropper】vue图片上传,vue-cropper图片裁剪后上传

在这里插入图片描述

一. 先看效果演示

在这里插入图片描述

二. 图片上传

用的el-upload加el-image组件
html部分

<el-dialog>
...//无关代码已省略<div v-for="item in imgArr" :key="item.index"><span>{{ item.name }}</span><el-upload action="#" list-type="picture-card" :on-change="onChange.bind(null, item.index)" :auto-upload="false" :file-list="item.fileList" :class="{ hide: item.hideUpload }"><i slot="default" class="el-icon-plus"></i><div slot="file" slot-scope="{ file }"><el-image class="el-upload-list__item-thumbnail" :src="item.aimgSrc" alt="" :onerror="defaultImg" :preview-src-list="item.fileList"></el-image><span class="el-upload-list__item-actions">// 预览按钮<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)"><i class="el-icon-zoom-in"></i></span>// 删除按钮<span class="el-upload-list__item-delete" @click="handleRemove(file, item.index)"><i class="el-icon-delete"></i></span>// 裁剪按钮<span v-if="item.index == 6" class="el-upload-list__item-delete" @click="beforeCrop(file)"><i class="el-icon-scissors"></i></span></span></div></el-upload></div>
</el-dialog>
....

注释:
el-upload
:on-change=“onChange.bind(null, item.index)” 不加.bind会报错,
:auto-upload=“false” 表示不自动上传,也就是手动上传
:file-list=“item.fileList” 上传的图片列表,数组对象格式[{url:xxxx}]
:class=“{ hide: item.hideUpload }” 到el-image使用,上传完后影藏那个加号和虚线框

el-image
:οnerrοr=“defaultImg” 图片加载失败,报错时候的默认图片.
:preview-src-list=“item.fileList” 预览的图片列表,同:file-list=“item.fileList”

预览,删除,裁剪,三个按钮,目前功能与预览无关,预览功能有空再另写吧

js部分

imgArr: [// aimgFile调接口, aimgSrc回显, hideUpload影藏加号, fileList预览大图{ index: 0, name: '图片A:', aimgFile: '', aimgSrc: '', hideUpload: false, fileList: [] },{ index: 1, name: '图片A:', aimgFile: '', aimgSrc: '', hideUpload: false, fileList: [] },{ index: 2, name: '图片A:', aimgFile: '', aimgSrc: '', hideUpload: false, fileList: [] },{ index: 3, name: '图片A:', aimgFile: '', aimgSrc: '', hideUpload: false, fileList: [] },{ index: 4, name: '图片A:', aimgFile: '', aimgSrc: '', hideUpload: false, fileList: [] },{ index: 5, name: '图片A:', aimgFile: '', aimgSrc: '', hideUpload: false, fileList: [] },{ index: 6, name: '图片A:', aimgFile: '', aimgSrc: '', hideUpload: false, fileList: [] },],files :'', //裁剪图片的标记// 上传图片 index 图片下标 file图片内容 flag裁剪图片的标记onChange(index, file, flag) {this.files = file.rawconst isJPG = file.raw.type === 'image/jpeg' || file.raw.type == 'image/png'const isLt2M = file.raw.size / 1024 / 1024 < 2if (!isJPG) {this.$message.error('上传图片只能是 JPG 或 PNG 格式!')this.handleRemove(file.raw, index)return}if (!isLt2M) {this.$message.error('上传图片大小不能超过 2MB!')this.handleRemove(file.raw, index)return}// 上传图片const fileData = new FormData()fileData.append('imgFile', file.raw)fileData.append('imgType', 1)// 调接口doctorAccessoryUpload(fileData).then((res) => {if (res) {this.imgArr[index].hideUpload = truethis.imgArr[index].aimgSrc = file.urlthis.imgArr[index].aimgFile = res.result// 裁剪后上传if (flag === 1) this.imgArr[index].fileList = [{ url: file.url }]} else {this.handleRemove(file.raw, index)}})},// 删除上传图片handleRemove(file, index) {this.imgArr[index].aimgSrc = ''this.imgArr[index].aimgFile = ''this.imgArr[index].fileList = []this.imgArr[index].hideUpload = false},
三. 裁剪图片

下载vueCropper插件

	npm i vue-cropper --save  // 我的版本是^0.6.4

另起一个dialog

      <!-- 图片裁剪 --><el-dialog title="图片裁剪" :visible.sync="cropDialog" width="40%" :modal="true" :close-on-click-modal="false" center @close="cropCancles" v-dialogDrag><div class="cropBox"><template><div><vueCropper@mouseenter.native="enter"@mouseleave.native="leave"ref="cropper":img="option.uploadImg":outputSize="option.size":outputType="option.outputType":info="true":full="option.full":canMove="option.canMove":canMoveBox="option.canMoveBox":original="option.original":autoCrop="option.autoCrop":fixed="option.fixed":fixedNumber="option.fixedNumber":centerBox="option.centerBox":infoTrue="option.infoTrue":fixedBox="option.fixedBox"></vueCropper></div></template><div><img :src="cropImg" alt="" /></div></div><div slot="footer"><el-button @click="cropCancles">取 消</el-button><el-button type="primary" @click="cropConfirm">裁剪图片</el-button></div></el-dialog><script>import { VueCropper } from 'vue-cropper'export default {components: { VueCropper },data() {return {cropDialog: false,option: {uploadImg: '', // 原图地址info: true, // 裁剪框的大小信息outputSize: 1, // 裁剪生成图片的质量outputType: 'jpeg', // 裁剪生成图片的格式canScale: true, // 图片是否允许滚轮缩放autoCrop: true, // 是否默认生成截图框fixedBox: true, // 固定截图框大小 不允许改变fixed: true, // 是否开启截图框宽高固定比例fixedNumber: [3, 4], // 截图框的宽高比例full: false, // 是否输出原图比例的截图canMove: true, //是否可以移动原图canMoveBox: true, // 截图框能否拖动original: false, // 上传图片按照原始比例渲染centerBox: true, // 截图框是否被限制在图片里面infoTrue: false, // true 为展示真实输出图片宽高 false 展示看到的截图框宽高},cropImg: require('../../public/img/default.png'),}}//开始裁剪enter() {if (this.option.uploadImg == '') {return}this.$refs.cropper.startCrop()},//停止裁剪leave() {this.$refs.cropper.stopCrop()this.$refs.cropper.getCropData((data) => {this.cropImg = data})},// 裁剪前beforeCrop(file) {this.option.uploadImg = file.urlthis.cropDialog = truesetTimeout(() => {this.$refs.cropper.getCropData((data) => {this.cropImg = data})}, 500)},// 确认裁剪cropConfirm() {//获取截图的base64格式数据this.$refs.cropper.getCropData((data) => {this.cropImg = datathis.handleRemove(this.files, this.imgArr.length - 1)this.cropCancles()setTimeout(() => {this.onChange(this.imgArr.length - 1, { raw: this.dataURLtoFile(data, 'Default.jpg'), url: data }, 1)}, 1000)})},// 取消裁剪cropCancles() {this.cropDialog = falsethis.option.uploadImg = ''this.cropImg = require('../../public/img/default.png')},// base64转filedataURLtoFile(dataurl, filename) {let arr = dataurl.split(',')let mime = arr[0].match(/:(.*?);/)[1]let bstr = atob(arr[1])let n = bstr.lengthlet u8arr = new Uint8Array(n)while (n--) {u8arr[n] = bstr.charCodeAt(n)}return new File([u8arr], filename, { type: mime })},}</script>

ok 结束了,记录一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/169703.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot 中@Value读取中文配置时乱码

1.spring boot 读取application.properties 该文件是iso8859编码 如果是直接写中文 读取时会乱码 显示成?? 必须得转ascii码才能正常显示 其他方法测试也不行 Value("${apig.order.tiaokong.qianzi}") private String apigOrderTiaokongQianzi;

Leetcode154. Find Minimum in Rotated Sorted Array II

旋转数组找最小&#xff0c;这次值可以重复 不妨假设你已经做了上一题&#xff0c;题解 上一题的方法1肯定是用不了了&#xff0c;因为不再能完全分成2个不同的部分 所以我们沿着方法2走 如果 > n u m s [ r ] >nums[r] >nums[r]&#xff0c;我们依然可以找右半边 …

【Linux C IO多路复用】多用户聊天系统

目录 Server-Client mutiplexingServer mutiplexingClient mutiplexing Server-Client 在Linux系统中&#xff0c;IO多路复用是一种机制&#xff0c;它允许一个进程能够监视多个文件描述符&#xff08;sockets、pipes等&#xff09;的可读、可写和异常等事件。这样&#xf…

UE地形系统材质混合实现和Shader生成分析(UE5 5.2)

前言 随着电脑和手机硬件性能越来越高&#xff0c;游戏越来越追求大世界&#xff0c;而大世界非常核心的一环是地形系统&#xff0c;地形系统两大构成因素&#xff1a;高度和多材质混合&#xff0c;此篇文章介绍下UE4/UE5 地形的材质混合方案----基于WeightMap混合。 材质层 …

微软近日限制员工访问ChatGPT!

作者 | 撒鸿宇 据CNBC报道&#xff0c;在这周四的短时间内&#xff0c;微软的员工被禁止使用ChatGPT。 微软在其内部网站的更新中表示&#xff1a;“由于安全和数据问题&#xff0c;一些AI工具不再对员工开放。”据CNBC查证&#xff0c;他们看到了一张截图&#xff0c;该截图显…

thinkphp6 起步

1、安装 composer create-project topthink/think6.0 tp62、使用多应用模式&#xff0c;你需要安装多应用模式扩展think-multi-app composer require topthink/think-multi-app3、config/app.php中&#xff0c;将 ‘auto_multi_app’ > flase, 改为true&#xff1b; 需要自…

毫米波雷达技术在自动驾驶中的关键作用:安全、精准、无可替代

自动驾驶技术正以前所未有的速度不断演进&#xff0c;而其中的关键之一就是毫米波雷达技术。作为自动驾驶系统中的核心感知器件之一&#xff0c;毫米波雷达在保障车辆安全、实现精准定位和应对复杂环境中发挥着不可替代的作用。本文将深入探讨毫米波雷达技术在自动驾驶中的关键…

基于C#+WPF编写的调用讯飞星火大模型工具

工具源码&#xff1a;https://github.com/lishuangquan1987/XFYun.SparkChat 工具效果截图&#xff1a; 支持流式输出: 其中ApiKey/ApiSecret/AppId需要自己到讯飞星火大模型官网去注册账号申请&#xff0c;免费的。 申请地址&#xff1a;https://xinghuo.xfyun.cn/ 注册之…

NestJS——基于Node.js 服务器端应用程序的开发框架

文章目录 前言什么是 NestJS&#xff1f; 一、NestJS特性&#xff1f;二、使用步骤Typescript 知识后端开发基本知识新建项目目录结构 前言 Nestjs中文文档 什么是 NestJS&#xff1f; Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用…

【论文阅读】PSDF Fusion:用于动态 3D 数据融合和场景重建的概率符号距离函数

【论文阅读】PSDF Fusion&#xff1a;用于动态 3D 数据融合和场景重建的概率符号距离函数 Abstract1 Introduction3 Overview3.1 Hybrid Data Structure3.2 3D Representations3.3 Pipeline 4 PSDF Fusion and Surface Reconstruction4.1 PSDF Fusion4.2 Inlier Ratio Evaluati…

【AICFD案例教程】汽车外气动-AI加速

AICFD是由天洑软件自主研发的通用智能热流体仿真软件&#xff0c;用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程&#xff0c;帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…