vue3加axios配合element-plus实现图片等文件本地上传,并获取服务器返回的真实地址数据,前端写法

本文主要是介绍vue3加axios配合element-plus实现图片等文件本地上传,并获取服务器返回的真实地址数据,前端写法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

小白写法嘿嘿

开发工具和关键词

开发工具: vscode

关键词:vue3、element-plus、axios

后端

后端业务逻辑处理使用的是unicloud的云函数,大家可以看我上一篇文章。

思路

1、禁止element-plus的el-upload组件自动上传,变成手动上传,提交表单时候统一处理上传文件

2、此时el-upload组件中的file文件保存到了v-model:file-list="fileList"的fileList的变量中,数据类型类型是file对象的数组

3、提交表单,循环fileList数组,将file数据类型的文件转化成base64编码

4、将子元素为base64编码数据的图片数组依次上传到服务器,并依次获取一个真实的服务器图片地址,并将这些真实地址保存到pictureslist数组

4、后面可以根据自己的代码逻辑处理真实地址的图片数组pictureslist,如:商品多张图片可以将数组转为json格式,保存到数据表中的某一个pictures字段中,后续展示商品直接读取即可

注意:这里不考虑文件上传中断和大文件的情况。

完整代码

 addproduct.vue

<template><div style="width: 80%;"><el-form :model="form" label-width="auto" style="max-width: 600px"><el-form-item label="标题"><el-input v-model="form.bt" /></el-form-item><el-upload v-model:file-list="fileList" action="ok" :auto-upload="false" list-type="picture-card":on-preview="handlePictureCardPreview" :on-remove="handleRemove" multiple><el-icon>添加<Plus /></el-icon></el-upload><el-dialog v-model="dialogVisible"><img w-full :src="dialogImageUrl" alt="Preview Image" /></el-dialog><el-form-item><el-button type="primary" @click="onSubmit">新增</el-button></el-form-item></el-form></div>
</template><script>
import { ref, reactive } from 'vue'
import axios from 'axios'const dialogImageUrl = ref('')
const dialogVisible = ref(false)//这里用了响应式数据
var form = reactive({bt: '',
//tp是保存了真实图片地址后的json数组tp: '',
})export default {name: 'HomeView',data() {return {form,dialogImageUrl,dialogVisible,fileList: [],zh: sessionStorage.getItem('zh')}},methods: {async onSubmit() {var that = thisconsole.log('submit!')console.log(this.form);if (this.fileList.length == 0) {return ElMessage({message: '请先上传图片!',grouping: true,type: 'warning',});}await this.upaction(); // 等待上传图片完成console.log("我的上传图片的真实路径", this.fileList);var pictureslist = []for (let i = 0; i < this.fileList.length; i++) {pictureslist.push(this.fileList[i].url)}// 将合并后的数组转换为 JSON 字符串var jsonString = JSON.stringify(pictureslist);console.log("转换后的 JSON 字符串", jsonString);// 将转换后的 JSON 字符串赋值给 this.form.tpthis.form.tp = jsonString;console.log("待上传表单数据", form);this.form.zh = this.zh// 将表单数据上传服务器const res = await axios.post("/api/addproduct", // 请求后端的 URLthat.form,{headers: {"Content-Type": "application/json;charset=utf-8","Access-Control-Allow-Origin": "*", // 允许所有域名访问,或者设置为特定的域名"Access-Control-Allow-Methods": "GET, POST, OPTIONS", // 允许的请求方法"Access-Control-Allow-Headers": "Content-Type", // 允许的请求头},});console.log("请求后", res);loadingInstance.close()ElMessage({message: '上传成功!',grouping: true,type: 'success',})},handlePictureCardPreview(uploadFile) {console.log(uploadFile);this.dialogImageUrl = uploadFile.urlthis.dialogVisible = true},handleRemove(file, fileList) {console.log(file)console.log(fileList)},// 依次上传图片async upaction() {var that = thisfor (let i = 0; i < this.fileList.length; i++) {var src = await this.uploadFile(this.fileList[i]);this.fileList[i].url = src}},//保存至服务器后返回真实图片路径地址async uploadFile(file) {console.log("uploadFile中,未编码url为", file.url);const newbasesrc = await this.getdata(file);console.log("编码url后", newbasesrc);const res = await axios.post("/api/upload", // 请求后端的 URL{ file: newbasesrc },{headers: {"Content-Type": "multipart/form-data;charset=utf-8","Access-Control-Allow-Origin": "*", // 允许所有域名访问,或者设置为特定的域名"Access-Control-Allow-Methods": "GET, POST, OPTIONS", // 允许的请求方法"Access-Control-Allow-Headers": "Content-Type", // 允许的请求头},});console.log(res);return res.data.fileUrl;},//以下两个自定义函数是为了将input直接获取的file对象转成base64编码格式async getdata(file) {// 使用 FileReader 将文件转换为 base64 编码字符串console.log("getdata函数中,准备转化", file);const base64String = await this.readFileAsBase64(file);console.log("获得编码", base64String);return base64String;},readFileAsBase64(file) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = (event) => {// 将文件转换为 base64 编码const base64String = event.target.result;resolve(base64String);};reader.onerror = reject;// 读取文件内容并转换为 base64 编码字符串reader.readAsDataURL(file.raw);});},}
}
</script>

 如果对您有所帮助,给个小赞赞吧!🌹

这篇关于vue3加axios配合element-plus实现图片等文件本地上传,并获取服务器返回的真实地址数据,前端写法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控