vue点击上传图片并实现图片预览功能,并实现多张图片放到一个数组中进行后端请求(使用原生input)

一、将 File 对象转成 BASE64 字符串 (FileReader)

<template><div><!-- 用来显示封面的图片 --><!-- <img src="@/assets/images/cover.jpg" alt="" class="cover-img" ref="imgRef" /> --><img :src="previewImg" alt="" class="cover-img" ref="imgRef" /><br /><!-- 文件选择框,默认被隐藏 --><input @change="coverImgChangeHandler" type="file"  accept="image/*" ref="iptFileRef" hidden/><!-- 选择封面的按钮 --><button type="text" @click="choosecoverImgHandler">+ 选择封面</button></div>
</template><script>
// ◆导入默认图片, webpack 就会进行打包
import coverImg from '@/assets/images/cover.jpg'
export default {data () {return {// ◆把默认图片赋值给封面图片显示previewImg: coverImg}},methods: {// ◆点击选择封面,触发图片选择框的点击事件choosecoverImgHandler () {this.$refs.iptFileRef.click()},// ◆图片选择框的 change 事件触发coverImgChangeHandler (e) {console.log(e.target.files)// 1.获取用户选择的文件对象const files = e.target.files// 2.判断用户是否选择了文件对象if (files.length === 0) {// 2.1用户没有选择图片(使用默认图片)// 法1// this.$refs.imgRef.src = coverImg// 法2this.previewImg = coverImg} else {// 2.2用户选择了图片(使用选择的图片)// ◆将 File 对象 转成 BASE64 字符串 // 1.创建 FileReader 对象const fr = new FileReader()// 2.调用 readAsDataURL 函数,读取文件内容fr.readAsDataURL(files[0])// 3.监听 fr 的 onload 事件fr.onload = (e) => {// 通过 e.target.result 获取到读取的结果,值是 BASE64 格式的字符串// 法1// this.$refs.imgRef.src = e.target.result// 法2this.previewImg = e.target.result}}}}
}
</script><style lang="less" scoped>
// 设置图片封面的宽高
.cover-img {width: 400px;height: 280px;object-fit: cover;
}
</style>

二、将 File 对象转成 url

<template><div><!-- 用来显示封面的图片 --><img :src="previewImg" alt="" class="cover-img" ref="imgRef" /><br /><!-- 文件选择框,默认被隐藏 --><input @change="coverImgChangeHandler" type="file"  accept="image/*" ref="iptFileRef" hidden/><!-- 选择封面的按钮 --><button type="text" @click="choosecoverImgHandler">+ 选择封面</button></div>
</template><script>
// ◆导入默认图片, webpack 就会进行打包
import coverImg from '@/assets/images/cover.jpg'
export default {data () {return {// ◆把默认图片赋值给封面图片显示previewImg: coverImg}},methods: {// ◆点击选择封面,触发图片选择框的点击事件choosecoverImgHandler () {this.$refs.iptFileRef.click()},// ◆图片选择框的 change 事件触发coverImgChangeHandler (e) {console.log(e.target.files)// 1.获取用户选择的文件对象const files = e.target.files// 2.判断用户是否选择了文件对象if (files.length === 0) {// 2.1用户没有选择图片(使用默认图片)this.previewImg = coverImg} else {// 2.2用户选择了图片(使用选择的图片)// 将 File 对象转成 urlthis.previewImg = URL.createObjectURL(files[0])}}}
}
</script><style lang="less" scoped>
// 设置图片封面的宽高
.cover-img {width: 400px;height: 280px;object-fit: cover;
}
</style>

三、总结与思考

总结

  • 设置默认图片:将图片作为模块导入,定义变量接收,赋值给图片的 src
    • 其他方法:使用自定义指令设置默认图片、在模板中使用 v-if
  • 点击上传图片按钮,触发图片输入框的 click 事件
    • 隐藏图片输入框:hiddendisplay:none
  • 绑定图片输入框 的 change 事件,获取文件对象 e.target.files
  • 判断 e.target.fileslength
    • 长度为0:用户取消选择图片,传给后台的数据就是 null,把默认图片赋值给当前预览区
    • 长度为1:用户确认选择图片,把 e.target.files[0]传给后台
  • 用户选择了图片之后,预览图片的方法:
    • 将获取的文件对象转成 BASE64 字符串:小图片
    • 将获取的文件对象转成 url:大图片

思考

为什么当用户选择了图片之后,我们不把 e.target.files[0] 直接赋值给预览图片的 srcpreviewImg,而传给后台就可以?

首先src 只支持 urlBASE64 字符串,而当后台需要的数据类型是 Blob 时,我们就可以直接把 e.target.files[0] 传给它,因为 File 就是 Blob 的子类,关系就像 ArrayObject 的关系一样。

进阶

一般进行身份认证时会上传身份证正反面,如果这时后端要求将两张身份证图片放到一个数组中进行请求应该如何做到呢?

首先,我们已经通过输入框 的 change 事件,获取到了文件对象 e.target.files e.target.files[0]为单个文件,将拿到的单个文件push到新的数组中,以下代码为vue3语法实现

//显示图片(图片预览方法)
export const readUrl=(file,preImg)=>{const fr = new FileReader()fr.readAsDataURL(file)fr.onload = (e) => {preImg.value = e.target.result//preImg为预览图片的数据}
}
//此为input框的change事件,以此拿到单个文件
const coverImgChangeHandler= (e)=> {form.value.authFiles.push(e.target.files[0])readUrl(e.target.files[0],previewImg)
}
//提交认证按钮
const submitForm =async (formEl: FormInstance | undefined) => {if (!formEl) returnawait formEl.validate((valid, fields) => {if (valid) {let formData = new FormData();//此处为重点!!记得遍历后再append,直接append报错form.value.authFiles.forEach((file) =>{formData.append('authFiles',file)})// console.log(formData)axios.post('url',formData).then((res) => {console.log(res)}).catch(err => {// console.log(err);})} else {// console.log('提交失败', fields)}})}

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

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

相关文章

最短编辑距离(线性dp)-java

最短编辑问题也是一种非常经典的二维线性dp问题。 文章目录 前言 一、最短编辑距离问题 二、算法思路 1.dp[i][j]的情况 2.边界问题初始化 3.状态转移方程 三、代码如下 1.代码如下 2.读入数据 3.代码运行结果 总结 前言 最短编辑问题也是一种非常经典的二维线性dp问题。 提示&…

C++学习进阶:unordered_set和ma的实现

目录 前言 1.哈希表的结构 1.1.哈希节点 1.2.迭代器的结构 1.2.1.普通迭代器 1.2.2.const迭代器的实现 1.3.哈希表的实现 2.如何封装哈希表实现个性化的容器 2.1.unordered_set的封装 2.2.unordered_map的封装 3.以上内容的代码实现 3.1.HashTable.h 3.2.unorde…

51单片机之LED点阵屏

目录 1.LED点阵屏简介 2.配置LED点阵屏代码 1.LED点阵屏简介 LED点阵屏真的是遍布我们我们生活的每个角落&#xff0c;从街边的流动显示字的招牌到你的液晶显示屏&#xff0c;都是基于点阵屏的原理研究出来的。还有那个世界上最大的球状建筑物&#xff1a;MSG Sphere&#xff…

低代码ARM计算机在IIoT中的采集控制生产面板

工业4.0的大潮下工业物联网&#xff08;IIoT&#xff09;已成为推动制造业转型升级的重要动力。其中&#xff0c;低代码ARM嵌入式计算机凭借其出色的性能、灵活的配置以及高度集成化的特点&#xff0c;在工业设备远程监控、维护与诊断方面发挥着关键作用。 一、远程监控与维护 …

python爬虫———post请求方式(第十四天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

Maven与Jave web结构

Maven 简介 https://www.liaoxuefeng.com/wiki/1252599548343744/1255945359327200 java web module web目录 –src 应用程序源代码和测试程序代码的根目录 –main –java  应用程序源代码目录     --package1     --class1     --class2 –resources  应用…

Docker内更新Jenkins详细讲解

很多小伙伴在Docker中使用Jenkins时更新遇到困难&#xff0c;本次结合自己的实际经验&#xff0c;详细讲解。根据官网Jenkins了解以下内容&#xff1a; 一、Jenkins 是什么? Jenkins是一款开源 CI&CD 软件&#xff0c;用于自动化各种任务&#xff0c;包括构建、测…

Mysql-数据库集群的搭建以及数据库的维护

一、数据库的维护 1.数据库的备份与恢复 1&#xff09;备份指定数据库 #mysqldump -u root -p zx > ./zx.dump 2&#xff09;备份所有库 #mysqldump -u root -p --all-databases > ./all.dump 3)恢复所有库 #mysql -u root -p < ./all.dump 4)恢复指定数据库 #mysq…

网络基础三——IP协议补充和Mac帧协议

全球网络及网段划分的理解 ​ 根据国家组织地区人口综合评估进行IP地址范围的划分&#xff1b; ​ 假设前8位用来区分不同的国家&#xff0c;国际路由器负责全球数据传输&#xff0c;子网掩码为IP/8&#xff1b;次6位区分不同的省份&#xff0c;国内路由器负责全国数据的传输…

再见 MybatisPlus,阿里推出新 ORM 框架更牛X

最近看到一个 ORM 框架 Fluent Mybatis 挺有意思的&#xff0c;整个设计理念非常符合工程师思维。 我对官方文档的部分内容进行了简单整理&#xff0c;通过这篇文章带你看看这个新晋 ORM 框架。 官方文档&#xff1a;https://gitee.com/fluent-mybatis/fluent-mybatis/wikis 提…

Golang | Leetcode Golang题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; func removeNthFromEnd(head *ListNode, n int) *ListNode {dummy : &ListNode{0, head}first, second : head, dummyfor i : 0; i < n; i {first first.Next}for ; first ! nil; first first.Next {second second.Next}second.N…

Redis缓存设计

文章目录 1 缓存的收益与成本分析1.1 收益1.2 成本 2 缓存更新策略的选择和使用场景2.1 LRU/LFU/FIFO算法剔除2.2 超时剔除2.3 主动更新2.4 缓存更新策略对比 2.5 最佳实践 3 缓存粒度控制方法3.1 缓存全部数据3.2 缓存部分数据3.3 缓存粒度控制方法对比 4 缓存穿透问题优化4.1…

(2022级)成都工业学院软件构造实验三:面向数据的软件构造

写在前面 1、基于2022级软件工程实验指导书 2、代码仅提供参考 3、如果代码不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 IntelliJ IDEA 2023.2.2 jdk17.0.6 实验要求 任务&#xff1a; ‍一、构造任务4&#xff1a;批量产生习题并用文件存储…

IntelliJ IDEA 2024.1安装与激活[破解]

一&#xff1a;IDEA官方下载 ①如题&#xff0c;先到IDEA官方下载&#xff0c;简简单单 ②IDEA官方&#xff1a;IntelliJ IDEA – the Leading Java and Kotlin IDE 二&#xff1a;获取脚本 &#x1f31f;网盘下载&#xff1a;jetbra (密码&#xff1a;lzh7) &#x1f31f;获取…

STC89C52学习笔记(七)

STC89C52学习笔记&#xff08;七&#xff09; 综述&#xff1a;本文介绍了串口以及讲述了串口相关寄存器如何配置并给予相关代码。 一、修改代码注意事项 在修改代码时不要一次性加入一堆代码&#xff0c;不利于定位错误。可以先注释一些代码&#xff0c;待解决完毕问题后再…

物联网农业四情在线监测系统

TH-Q2随着科技的飞速发展和信息化时代的来临&#xff0c;物联网技术在各个领域都取得了显著的应用成果。其中&#xff0c;物联网农业四情在线监测系统作为农业现代化的重要组成部分&#xff0c;正在为农业生产带来革命性的变革。 一、物联网农业四情在线监测系统的概念 物联网…

大模型笔记:Prompt tuning

1 NLP模型的几个阶段 1.1 第一阶段&#xff08;在深度学习出现之前&#xff09; 通常聚焦于特征工程&#xff08;feature engineering&#xff09;利用领域知识从数据中提取好的特征 1.2 第二阶段&#xff08;在深度学习出现之后&#xff09; 特征可以从数据中习得——>…

使用 kaggle api 实现 kaggle 数据快速下载

在下载kaggle数据集时&#xff0c;以猫狗数据集举例子&#xff0c;有两种方法&#xff1a; Dogs vs. Cats | Kaggle 1&#xff1a;直接浏览器下载&#xff0c;较慢&#xff0c;不推荐。 2&#xff1a;使用kaggle API下载&#xff0c;很快。本文重点介绍。详情可以&#xff1…

Web前端-Ajax

Ajax 概念:Asynchronous JavaScript And XML,异步的JavaScript和XML。 作用: 1.数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。 2.异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用的校验等等…

ARM嵌入式控制器带HDMI为制造业注入智能动力

工业自动化技术的飞速发展&#xff0c;IT与OT的融合已成为推动工业进步的关键力量。在这个背景下&#xff0c;ARM工业计算机凭借其强大的功能和灵活性&#xff0c;成为了边缘自动化领域的一颗新星。今天&#xff0c;我们将深入探讨这款设备如何通过其独特的特性&#xff0c;助力…