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

2023-11-10 19:36

本文主要是介绍【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 结束了,记录一下

这篇关于【vue+el-upload+vue-cropper】vue图片上传,vue-cropper图片裁剪后上传的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384819

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni