当前位置: 首页 > news >正文

【Vue】以RuoYi框架前端为例,ElementUI封装图片上传组件——将图片信息转成base64后提交到后端保存

RuoYi 框架本身对于图片上传功能,在ElementUI<el-upload> 组件的基础装封装了 @/components/ImageUpload/index.vue 组件。本组件就是在 RuoYi 自定义的 <ImageUpload> 组件的基础上进行改造,将图片的信息在上传之前处理成 base64 格式,用于提交到后端接口,以及前端图片相应的预览展示。

自定义组件 ImageUploadBase64

组件目录 : @/components/ImageUploadBase64/index.vue

<template><div class="component-upload-image"><el-upload ref="imageUploadRef"action="#"list-type="picture-card"accept=".png, .jpeg, .jpg":limit="limit":on-change="handleChange":on-remove="handleRemove":on-preview="handlePictureCardPreview":on-exceed="handleExceed":file-list="fileList":class="{hide: this.fileList.length >= this.limit}":show-file-list="true":auto-upload="false"><i class="el-icon-plus"></i></el-upload><el-dialog :visible.sync="previewDialogVisible" title="图片预览" width="800" append-to-body><el-image style="display: block; max-width: 100%; margin: 0 auto":src="previewDialogImageUrl" alt=""></el-image></el-dialog></div>
</template>
<script>export default {props: {// 对应父组件 v-model绑定,对应本组件 this.$emit("input",参数)绑定value: [String, Object, Array],// 图片数量限制limit: {type: Number,default: 5,},// 大小限制(MB)fileSize: {type: Number,default: 5,},// 文件类型, 例如['png', 'jpg', 'jpeg']fileType: {type: Array,default: () => ["png", "jpg", "jpeg"],},},data() {return {// 图片预览弹窗 显隐previewDialogVisible: false,// 图片预览 urlpreviewDialogImageUrl: '',// 待上传的图片集合 是转化完base64 后的结果fileList: [/*{name:'',url:''}*/]}},watch: {value: {handler(val) {if (val) {// 首先将值转为数组const list = Array.isArray(val) ? val : this.value.split(',');// 然后将数组转为对象数组this.fileList = list.map(item => {if (typeof item === "string") {item = {name: item, url: item};}return item;});} else {this.fileList = [];return [];}},deep: true,immediate: true}},methods: {/*** 校验文件尺寸是否符合要求 和类型是否是图片* @param file* @returns {boolean}*/handleFileValidate(file) {// 上传文件的类型let type = file.raw.type || file.type;let isImg = type.indexOf("image") > -1;if (isImg) {if (this.fileSize) {const isLt = file.size / 1024 / 1024 < this.fileSize;if (!isLt) {this.$message.error(`上传头像图片大小不能超过 ${this.fileSize} MB!`);return false;} else {return true;}}} else {this.$message.error(`文件格式不正确, 请上传${this.fileType.join("/")}图片格式文件!`);// 不是图片格式return false;}},/* 添加文件、上传成功和上传失败时都会被调用 */handleChange(file, fileList) {if (this.handleFileValidate(file)) {this.fileToBase64(file);} else {// 删除尺寸大的图片 或者非图片类型的文件let lastIndex = fileList.length - 1;if (lastIndex > -1) {fileList.splice(lastIndex, 1);}}},/*** 删除图片* @param file 被删除的图片* @param fileList 剩余的文件信息列表*/handleRemove(file, fileList) {const findex = this.fileList.map(f => f.url).indexOf(file.url);if (findex > -1) {// 删除对应的 文件数据this.fileList.splice(findex, 1);this.$emit("input", this.listToArray(this.fileList));}},/*预览图片*/handlePictureCardPreview(file) {this.previewDialogImageUrl = file.url;this.previewDialogVisible = true;},/*** 文件个数超出* @param files 超出的文件信息* @param fileList 原来已经添加的文件信息*/handleExceed(files, fileList) {this.$message.error(`上传文件数量不能超过 ${this.limit} 个!`);},/*** 将el-upload组件上传的文件转为base64* @param file*/fileToBase64(file) {var reader = new FileReader();reader.readAsDataURL(file.raw); // 转换为Base64reader.onload = e => {// 当转换完成后,e.target.result就是Base64字符串const base64 = e.target.result;this.fileList.push({name: base64, url: base64});this.$emit("input", this.listToArray(this.fileList));};},// list中的元素{name:'',url:''} 转 url字符串listToArray(list) {let arr = [];for (let i in list) {arr.push(list[i].url);}return arr;}}
}</script>
<style scoped lang="scss">
// .el-upload--picture-card 控制加号部分
::v-deep.hide .el-upload--picture-card {display: none;
}// 去掉动画效果
::v-deep .el-list-enter-active,
::v-deep .el-list-leave-active {transition: all 0s;
}::v-deep .el-list-enter, .el-list-leave-active {opacity: 0;transform: translateY(0);
}
</style>

表单中引用如下

<template><div class="app-container"><!-- 添加或修改对话框 --><el-dialog :title="title" :visible.sync="open" width="500px" append-to-body><el-form ref="form" :model="form" :rules="rules" :show-message="false" label-width="80px"><el-col :span="24"><el-form-item label="上传图片"><ImageUploadBase64 v-model="form.base64DataList" :file-size="10" @input="handleImageInput"></ImageUploadBase64></el-form-item></el-col></el-row></el-form><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitForm()">保 存</el-button><el-button @click="cancel">取 消</el-button></div></el-dialog></div>
</template><script>
import ImageUploadBase64 from "@/components/ImageUploadBase64/index.vue";import {listWorkInfo, getWorkInfo, delWorkInfo, addWorkInfo, updateWorkInfo} from "@/api/basic/work";export default {name: "Work",components: {ImageUploadBase64},data() {return {// 弹出层标题title: "",// 是否显示弹出层open: false,// 表单参数form: {},};},created() {this.getList();},methods: {/*** 子组件 this.$emit("input", this.listToArray(this.fileList)); 返回的数据* @param fileList*/handleImageInput(fileList){// 这里返回的就是base64字符串的数组,可以直接提交后端接口,也可以根据业务做其他处理console.log("handleImageInput-----:", fileList)},// 取消按钮cancel() {this.open = false;this.reset();},// 表单重置reset() {this.form = {id: nullbase64DataList:[]};this.resetForm("form");},/** 新增按钮操作 */handleAdd() {this.reset();this.title = "添加工作信息";this.open = true;},/** 修改按钮操作 */handleUpdate(row) {this.reset();const id = row.id || this.idsgetWorkInfo(id).then(response => {this.form = response.data;this.open = true;this.title = "修改工作信息";});},/** 提交按钮 */submitForm: function () {this.$refs["form"].validate(valid => {if (valid) {if (this.form.id != undefined) {updateWorkInfo(this.form).then(response => {this.$modal.msgSuccess("修改成功");this.open = false;this.getList();});} else {addWorkInfo(this.form).then(response => {this.$modal.msgSuccess("新增成功");this.open = false;this.getList();});}}});}}
};
</script>

这个组件将图片信息直接在前端转化成 base64格式的字符串数字,后端可以直接使用List<String> 接收图片的信息并进行后续的处理。

相关文章:

【Vue】以RuoYi框架前端为例,ElementUI封装图片上传组件——将图片信息转成base64后提交到后端保存

RuoYi 框架本身对于图片上传功能&#xff0c;在ElementUI的 <el-upload> 组件的基础装封装了 /components/ImageUpload/index.vue 组件。本组件就是在 RuoYi 自定义的 <ImageUpload> 组件的基础上进行改造&#xff0c;将图片的信息在上传之前处理成 base64 格式&am…...

【Linux】驱动的基本架构和编译

驱动源码 /** Silicon Integrated Co., Ltd haptic sih688x haptic driver file** Copyright (c) 2021 kugua <daokuan.zhusi-in.com>** This program is free software; you can redistribute it and/or modify it* under the terms of the GNU General Public Licen…...

1013. 将数组分成和相等的三个部分 数组切分

1013. 将数组分成和相等的三个部分 已解答 简单 相关标签 相关企业 提示 给你一个整数数组 arr&#xff0c;只有可以将其划分为三个和相等的 非空 部分时才返回 true&#xff0c;否则返回 false。 形式上&#xff0c;如果可以找出索引 i 1 < j 且满足 (arr[0] arr[…...

【深度学习】—— 自动微分、非标量变量的反向传播、 分离计算、 Python控制流的梯度计算

【深度学习】—— 自动微分 自动微分一个简单的例子 非标量变量的反向传播分离计算Python控制流的梯度计算 自动微分 求导是⼏乎所有深度学习优化算法的关键步骤。虽然求导的计算很简单&#xff0c;只需要⼀些基本的微积分。但对于复杂的模型&#xff0c;⼿⼯进⾏更新是⼀件很…...

Java项目实战II基于Java+Spring Boot+MySQL的大学城水电管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着大学城规模的不断扩大和学生数量的急剧增加&#xff0c;大学城内的水电管理面临着前所未有的挑战…...

Vue 组件的三大组成部分详解

文章目录 模板&#xff08;template&#xff09;脚本&#xff08;script&#xff09;样式&#xff08;style&#xff09;总结 在 Vue.js 中&#xff0c;组件是构建用户界面的重要基石。一个 Vue 组件通常由三个主要部分组成&#xff1a;模板&#xff08;template&#xff09;、…...

深入理解Java内部类

一、什么是内部类 内部类是定义在另一个类内部的类。内部类与外部类&#xff08;Enclosing Class&#xff09;之间存在着紧密的联系&#xff0c;可以访问外部类的成员变量和方法&#xff0c;这使得它们在某些场景下非常有用。 1.1 内部类的分类 Java中的内部类主要有以下几种…...

fiddler抓包12_篡改请求(请求前断点)

课程大纲 原理 正常“客户端-服务器”通信&#xff0c;即发送请求&#xff0c;接收返回。 Fiddler抓包是「客户端-浏览器」进行交互时&#xff0c;请求和响应都会从Fiddler通过&#xff0c;Fiddler可以捕获并展示。 请求前断点&#xff08;BreakPoint Before Request&#xff0…...

Webpack和GuIp打包原理以及不同

Webpack打包原理 Webpack的打包原理主要基于模块化的概念&#xff0c;它将应用程序中的所有资源&#xff08;如JS、CSS、图片等&#xff09;视为模块&#xff0c;并根据模块间的依赖关系进行静态分析。Webpack会递归地构建一个依赖关系图&#xff08;dependency graph&#xf…...

c++与Python用笛卡尔的心形函数输出爱心

我突然想到输出爱心是否可以用笛卡尔的心形函数 在IDLE里用Python输出下面这个图形 在小熊猫c里用c输出下面这个图形 如果当你要输出这些的时候会怎么办 低级:纯输出 print( ********* ********* ***************** ***************** …...

Mybatis 9种动态 sql 标签使用

MyBatis提供了9种动态SQL标签&#xff1a;trim、where、set、foreach、if、choose、when、otherwise、bind&#xff1b; 1.if 标签 <select id"getUser">select * from User<where><if test" age ! null ">and age > #{age}</if…...

OpenHarmony(鸿蒙南向)——平台驱动开发【PIN】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 PIN即管脚控制器&#xff0c;用于统一管理各SoC的…...

南平自闭症寄宿制学校:让孩子自信绽放

在繁华与喧嚣交织的都市之中&#xff0c;有一片静谧而充满希望的土地——广州星贝育园自闭症儿童寄宿制学校&#xff0c;这里不仅是知识的殿堂&#xff0c;更是自闭症儿童心灵成长的温馨家园。星贝育园&#xff0c;以其独特的教育理念与细致入微的关怀&#xff0c;为这些特殊的…...

汽车总线之---- LIN总线

Introduction LIN总线的简介&#xff0c;对于传统的这种点对点的连接方式&#xff0c;我们可以看到ECU相关的传感器和执行器是直接连接到ECU的&#xff0c;当传感器和执行器的数量较少时&#xff0c;这样的连接方式是能满足要求的&#xff0c;但是随着汽车电控功能数量的不断增…...

Android开发MPAndroidChart两条折线图

Android开发MPAndroidChart两条折线图 Android开发两条折线图效果&#xff0c;还是有一定难度的&#xff0c;难点它的起点不是坐标0的开始&#xff0c;还有数值上有背景图 一、思路&#xff1a; 用的是MPAndroidChart的BarChart 二、效果图&#xff1a; 三、关键代码&#…...

HTML-ES6.0核心技术

1.ES6简介 ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在2015年6月正式发布了。它的目标&#xff0c;是使得 JavaScript 语言可以用来编写复杂的大型应用程序&#xff0c;成为企业级开发语言。ECMAScript 和 JavaScri…...

车间调度问题数学建模与CPLEX优化

完成了这些基础研究工作&#xff0c;整理成文档以供参考 序言... i 第一章 引言... 1 1.1 车间调度问题概述... 1 1.2 车间调度问题分类表示法... 5 1.3 车间调度对制造企业的作用... 6 1.4 本章小结... 7 第二章 CPLEX基础... 8 2.1 CPLEX概述... 8 2.1.1 CPLEX简介.…...

< 基础物理 >

SI国际单位制 常见的公制单位 为什么需要单位&#xff0c;是统一衡量的标准 通过国际单位&#xff0c;以及单位的拓展&#xff0c;以及单位的组合&#xff0c;形成一系列新的测量单位 面积 m^2 速率 m/s 米每二次方秒&#xff0c;m / s, delta表示增量, 每秒移动多少米 加…...

【web开发】Spring Boot 快速搭建Web项目(三)

Date: 2024.08.31 18:01:20 author: lijianzhan 简述&#xff1a;根据上篇原文Spring Boot 快速搭建Web项目&#xff08;二&#xff09;&#xff0c;由于已经搭建好项目初始的框架&#xff0c;以及自动创建了一个启动类文件&#xff08;TestWebApplication.java&#xff09; …...

无人机之战斗机的详解!

一、高性能飞行能力 高速飞行&#xff1a;具备较高的巡航速度和最大飞行速度&#xff0c;以便快速抵达任务区域并灵活应对战场情况。 长航程&#xff1a;拥有足够的航程以执行远程任务&#xff0c;覆盖广阔的作战区域 高升限&#xff1a;能够飞行到较高的高度&#xff0c;以…...

Z-Image-Turbo_Sugar脸部Lora模型服务运维指南:监控、日志与故障排查

Z-Image-Turbo_Sugar脸部Lora模型服务运维指南&#xff1a;监控、日志与故障排查 最近在帮一个做创意设计的朋友维护他们的AI图像生成服务&#xff0c;他们用的就是Z-Image-Turbo_Sugar这个专门生成特定风格人脸的Lora模型。朋友跟我吐槽&#xff0c;说服务时不时就“抽风”&a…...

PHY芯片寄存器设计揭秘:从5位地址到分页扩展的演进史

PHY芯片寄存器设计演进&#xff1a;从5位地址到分页扩展的技术革命 当我们在享受千兆以太网带来的高速数据传输时&#xff0c;很少有人会想到这背后隐藏着一场持续了数十年的寄存器架构演进。PHY芯片作为网络通信的物理层核心&#xff0c;其寄存器设计经历了从简单固定到复杂可…...

OpenCVSharp摄像头开发避坑指南:C#实现高清录像+实时滤镜(WinForm版)

OpenCVSharp工业级摄像头开发实战&#xff1a;高清录像与实时滤镜的进阶技巧 在工业视觉检测和实时直播领域&#xff0c;稳定高效地采集视频流是核心需求。C#开发者常选择OpenCVSharp作为计算机视觉开发工具&#xff0c;但实际应用中总会遇到帧率不稳定、资源泄漏或参数配置不当…...

STM32F103红外小车避坑指南:从Proteus仿真失败到实物调试成功

STM32F103红外小车避坑指南&#xff1a;从Proteus仿真失败到实物调试成功 第一次尝试用STM32F103做红外循迹小车时&#xff0c;我花了整整三天时间在Proteus里调试仿真&#xff0c;结果连最基本的电机转动都实现不了。直到把电路搬到实物上&#xff0c;才发现仿真环境里那些看似…...

小爱音响音乐服务:如何让智能音箱变身私人音乐管家?

小爱音响音乐服务&#xff1a;如何让智能音箱变身私人音乐管家&#xff1f; 【免费下载链接】xiaomusic 使用小爱音箱播放音乐&#xff0c;音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 你是否曾经想过&#xff0c;家里的小爱音…...

在Python项目中是否应该采用分层结构

在学习Python的过程中&#xff0c;许多开发人员会发现&#xff0c;一些Django项目在视图函数中包含了大量的业务逻辑&#xff0c;类似于Java中的控制器进行过多的业务处理。这导致了一个关键问题&#xff1a;Python项目是否应该采用分层结构&#xff1f;这与MVC(模型-视图-控制…...

Nunchaku-flux-1-dev参数详解:CFG Scale、种子数等关键参数实战影响

Nunchaku-flux-1-dev参数详解&#xff1a;CFG Scale、种子数等关键参数实战影响 你是不是也遇到过这样的情况&#xff1a;用同一个模型&#xff0c;别人生成的图片细节满满、创意十足&#xff0c;而你生成的却总是差点意思&#xff0c;要么太放飞自我&#xff0c;要么又过于死…...

弦音墨影保姆级教程:解决‘视频加载失败’‘墨迹不跟随目标’等10类高频问题

弦音墨影保姆级教程&#xff1a;解决‘视频加载失败’‘墨迹不跟随目标’等10类高频问题 1. 系统简介与核心价值 「弦音墨影」是一款将人工智能技术与传统美学完美融合的视频分析工具。它采用水墨丹青的视觉风格&#xff0c;通过先进的Qwen2.5-VL多模态技术&#xff0c;让视频…...

STEP3-VL-10B实际作品集:MMBench 92.05分视觉识别能力高清图文输出示例

STEP3-VL-10B实际作品集&#xff1a;MMBench 92.05分视觉识别能力高清图文输出示例 1. 引言&#xff1a;当AI“看懂”了世界 你有没有想过&#xff0c;让AI像人一样“看懂”一张图片&#xff0c;到底有多难&#xff1f; 这不仅仅是识别出图片里有什么东西那么简单。比如给你…...

springboot+vue基于web的校园商铺摊位管理系统

目录功能模块分析技术实现要点扩展功能建议数据库设计关键表项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作##同行可拿货,招校园代理 ,本人源头供货商功能模块分析 后台管理模块&#xff08;SpringBoot&#xff09; 管理员登…...