使用Vue + FormData + axios实现图片上传功能实战

news2024/12/27 11:28:09

前言

上节回顾

上一小节中,我们添加了Vue-router的路有数据,这些数据都将是后续实战课程中的真实路由数据了。同时引入了ElementUIel-menu做为左侧菜单的组件,但本专栏的特点就是遇到第三方功能和组件,自己尽量也要实现一遍,所以,在文章末尾又自己实现了一个tg-menu的组件。如果还不是很明白上下文的同学,可以回过头去看上一节的内容:使用Vue+Vue-router+el-menu实现菜单功能实战

本节介绍

本小节已经是专栏的第11篇博客了,这一节本来是准备开始做图书信息上传的,但考虑到图书信息上传中,有个图片上传的功能点,需要单独抽出一节来说。所以,这一节我们主要是围绕着Vue项目中,通过FormData + axios来实现单个图片上传的功能。

相信你读完本小节,会发现,狗哥这篇文章里,或许不至有图片上传哦。

目录

前言

一、DOM内容的添加

1. 上传按钮和图片预备容器

2. DOM内容说明 

3. 数据依赖的添加

二、上传事件说明

1. 上传事件准备

2. 上传事件说明 

三、axios上传零件

1. 引入 uploadFile 上传方法

2. 添加 uploadFile 实现代码 

3. 添加url管理 

四、实现效果展示

1. 上传前

2. 上传请求

 

3. 上传后预览

五、本小节的周边


一、DOM内容的添加

在Vue中,说DOM的添加总感觉有点别扭,因为我们所书写的HTML DOM部分,是放置在template模板里的,而这里的模板内容离真实的DOM其实还有很多步骤。不过这里先略过这些,我们就以DOM为例。

1. 上传按钮和图片预备容器

在真实的项目中,用户点击的必定不是那个比较丑陋的input file组件,而是提供一个对用户非常友好的上传按钮。然后再放置一个DIV元素,用来预备存放上传成功后的图片,以达到预览的效果。

本小节暂时不用真实的业务组件来开发,先做一个小例子,一旦做成了,下一节图书信息上传就可以直接使用了。打开 /views/HelloWorld.vue 文件,书写以下DOM代码:

<el-button @click="uploadImage">上传图片</el-button>
    <p>展示图片:<p>
    <div style="width: 300px;height: 300px;border: 1px solid #CCC;">
      <img :src="upImage" v-if="upImage" style="width: 300px;height: 300px;" />
    </div>

    <input ref="imgFile" type="file" 
      name="file" accept="image/png,image/gif,image/jpeg,image/jpg" 
      @change="go2UploadImg($event)" style="display: none;">

2. DOM内容说明 

  • el-button做为用户点击的“上传按钮”;
  • DIV元素用来预备预览存放上传后的图片;
  • img元素,我们用v-if=“upImage”做为显示判断,如果不做判断,在上传图片前会是一个叉叉的错误图片;
  • input type="file"组件是HTML原生的Input组件,也是图片上传中重要的一个环节,用来选取本机系统中的图片
  • 一般用户不直接点击input type="file"的组件,而是采用点击正常按钮,点击的同时主动触发上传组件,而后通过change事件做上传实现
  • accept属性表示可上传图片的类型,本例中可选择系统中png gif jpeg jpg这4类图片

 

 

3. 数据依赖的添加

新学习Vue的小伙伴可能还不太习惯,什么data数据,什么数据依赖,什么双向绑定,就不能说人话吗?的确如此,越接触破词越多,总是有那么多人喜欢造词。

好吧,说远了,我们上面说到img元素在还没有赋值的时候,会是叉叉,很不友好。所以添加了v-if="upImage"的判断。这里的upImage就是依赖于数据渲染的变量,而说到数据依赖,要想到Vue组件中下面这处代码,data函数中的数据就是所谓的数据依赖

 

二、上传事件说明

1. 上传事件准备

图片上传是一种行为,是一系列事件。而我们上面说,要通过点击“上传图片”按钮,去触发type="file"的原生组件,而原生组件被触发上传的重点在于change事件,这里注意,click事件只是去触发选择,说白了就是通过代码悄悄的触碰一下上传组件,代码如下

methods: {
    uploadImage() {
      this.$refs.imgFile.click();
    },
    go2UploadImg(e) {
      const file = e.target.files[0];
      const formData = new FormData();
      formData.append("file", file);

      uploadFile(formData).then((res) => {
        this.upImage = res.data;
      }).catch(() => {
        console.log('图片上传异常,请联系技术人员');
      })
    }
  }

2. 上传事件说明 

uploadImage方法中,我们采用refs的方式获取type="file"组件,并且使用click的方式,触发组件的选择功能;

而被处罚的change事件go2UploadImg,才是重点所在。我们通过new FormData对象,在对象中将图片文件信息存进去,做为入参,调用接口进行上传。

 

三、axios上传零件

因为之前的章节,把axios功能解耦封装的过程已经说过了,而且项目搭建之初做一个很好的整理,对项目实战过程也是事半功倍的。

1. 引入 uploadFile 上传方法

/views/HelloWorld.vue 文件中,引入uploadFile方法,用于业务组件中上传调用,代码如下:

import { uploadFile } from '@/api/uploadImage.js';

2. 添加 uploadFile 实现代码 

新建 /src/api/uploadImage.js文件,这里是 uploadFile 方法的具体实现,而刚才HelloWorld.vue中是业务组件的引用,这里要区分开,代码如下:

import request from '../utils/httpRequire.js';
import { URLS } from '../config/httpUrl.js';

// 上传图片
export function uploadFile(data) {
    return request({
        url: URLS.upFile,
        method: 'post',
        data,
    });
}

 api目录下的文件,之前的章节说过,会做一些ajax上传的具体实现,而需要注意的几点就是:

  • request 的引入,这里因为httpRequire.js已经实现完成了,保证每次新建实现文件,引入就好了
  • URLS,是对请求url做了一个统一的管理,每个ajax请求会不一样;
  • 整理过后的data入参数据也很方便,直接在业务组件中整理好json数据就可以了

3. 添加url管理 

打开 /src/config/httpUrl.js 文件,添加新的上传接口url即可,代码如下:

import { HPPT_IP } from "./httpIp";

export const URLS = {
  testPost: HPPT_IP + '/admin/book',    // post测试路径
  testGet: HPPT_IP + '/admin/book',     // post测试路径
  login: HPPT_IP + '/auth/login',       // 登录接口
  logout: HPPT_IP + '/auth/logout',     // 登出接口

  upFile: HPPT_IP + '/upload/image',     // 上传图片
}

四、实现效果展示

1. 上传前

上传前,是一个上传按钮,一个预备DIV元素,如图:

2. 上传请求

上传过程中headers有个关键的参数tgCsrfToken,用于判断当前用户是否处于登录状态

 

 

3. 上传后预览

上传后,服务端已经将图片存储起来,并且把存储的服务器图片链接返回来了,刚才我们在代码中用了 this.upImage = res.data;  应该还记得吧。到这里,我们这一节的内容就算成功结束了。

 

五、本小节的周边

依照惯例,我们在文章末尾提出一些关于本文的思考题,这些题和文章内容一样重要。而且这些思考题很有意思,每隔一段时间再回过头来看得时候,总会有新的想法,新的解释,提醒自己再不断地前行着

  • 如果让你设计一个图片上传组件,封装起来,你准备如何做?
  • 你觉得把一个图片存到数据库里,应该怎么存?
  • FormData有什么用?请说出自己的理解
  • 如果不用axios上传图片,用jQuery来做呢,怎么做?
  • 如何实现多图片上传

感谢天哥(天哥主页)提供好用的接口,而且天哥的《SpringBoot+Vue前后端分离项目实战》专栏已经积累了25篇实战博客了,看来我该追赶一下了。

转眼间,又快要端午节了,这次放假后,就得再等100天才能再放假了。有时候想时间过得快一些,期盼假期,有时候想时间流逝的慢一些,让自己的青春多停留一下。很纠结,但我们何尝又不是经常在纠结中磨炼,在纠结中成长呢。祝大家端午节快乐吧!我为大家准备了非常有意思的投票,相信不会让你失望的

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝牙ATT协议介绍

介绍 ATT&#xff0c;Attribute Protocol&#xff0c;用于发现、读、写对端设备的协议(针对BLE设备) ATT允许蓝牙远程设备&#xff08;比如遥控器&#xff09;作为服务端提供拥有关联值的属性集&#xff0c;让作为客户端的设备&#xff08;比如手机、电视&#xff09;来发现、…

【软件工程】软件工程期末考试试卷

瀑布模型把软件生命周期划分为八个阶段&#xff1a;问题的定义、可行性研究、软件需求分析、系统总体设计、详细设计、编码、测试和运行、维护。八个阶段又可归纳为三个大的阶段&#xff1a;计划阶段、开发阶段和( C)。 A、详细计划 B、可行性分析 C、 运行阶段 D、 测试与排…

JavaScript中的CRUD操作指南示例 - 用DHTMLX创建医院管理系统!

创建、读取、更新和删除(CRUD)是现代web和移动应用程序执行的四个基本功能。然而这些函数是如何产生的&#xff0c;它们到底是做什么的&#xff1f; 在本文中&#xff0c;我们将简要介绍CRUD的含义以及它何时被引入编程的。文中我们还将使用用于医院管理的JavaScript演示应用程…

图文并茂spring-boot3 热部署配置(IntelliJ IDEA 2023.1)

文章目录 &#x1f95a; 版本情况&#x1f9c2; 前言&#xff08;踩坑&#xff09;&#x1f357; 四步完成spring-boot热部署&#x1f957; 1、下载热部署模块&#x1f957; 2、application.yml 或者application.properties添加dev-tools配置&#x1f957; 3、settings中勾选条…

设计服务要考虑的7个维度

我在《软件设计的核心方法及实例解析》里提到软件设计的核心方法是分解和组合。分解粒度上&#xff0c;不同的架构师想法不一样&#xff0c;但是却有一点共性&#xff1a;设计一定要把不稳定的部分做封装&#xff0c;对外暴露稳定的部分&#xff0c;这也是有接口隔离这一原则的…

VS code 可以做什么?

编写 markdown VS code 真的是非常好用的Markdown编写工具&#xff0c;我用他来编写Markdown的时间甚至比写代码还要多。比如&#xff0c;我每周写的公众号文章。 相关插件&#xff1a; MarkdownMarkdown Preview EnhancedMarkdown All in One 编写python 大多数同学写pyth…

LLM - 基于 ChatGLM-6B 的工程配置搭建私有 ChatGPT 中文在线聊天

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131104546 Paper&#xff1a;GLM: General Language Model Pretraining with Autoregressive Blank Infilling 一篇于2022年发表在ACL会…

脑机接口科普0021——黑门01

本文禁止转载&#xff01;&#xff01;&#xff01;&#xff01; 我会在接下来的一段时间内&#xff0c;花一些章节&#xff0c;专门科普介绍一下《黑门》这部国产动漫。 科普《黑门》&#xff0c;源自网友看了我的脑机接口科普文章后&#xff0c;介绍我看黑门这个脑机接口科…

盘点那些 IT 技术面试官常用的 10 个挂人套路

最近几个朋友找我聊天&#xff0c;给我讲述了面试过程中遇到的一些不太理解的事情。作为一个技术面试官&#xff0c;今天来分享 10 个面试相关的套路。 1.自我介绍 自我介绍是一个重要的开始&#xff0c;好的开始是成功的一半。不需要太多花里胡哨的东西&#xff0c;简单、清…

86墙插双联明装新款:蓝奥声智能用电设备安全防护有多强

物理绝缘和智能数据分析安全技术重塑了墙壁插座的安全标准&#xff0c;极大可能规避日常生活中的意外&#xff0c;只有做到意外情况下也不会触电&#xff0c;这样的墙壁插座才能真正叫安全墙壁插座&#xff0c;“不触电且足够安全”应该成为墙壁插座的安全标配标准。 智能物理…

检测 ARP 欺骗

地址解析协议 &#xff08;ARP&#xff09; 是网络通信的基本推动因素。作为网络互联网层和网络链路层之间的桥梁&#xff0c;此网络协议将网络地址 &#xff08;IP&#xff09; 转换为物理层地址&#xff08;MAC 地址&#xff09;。ARP协议支持的地址转换在促进同一LAN中不同网…

给数据库构建一个展示界面

给mySQL构建一个展示界面 这是“构建个人小型医学数据库”系列文章的最后一部分。通过之前的工作我们确定了所要收集的各类变量并将其录入到mySQL数据库中。 为了展示MySQL中存储的数据&#xff0c;通过摸索我们最终使用appML、PHP和JavaScript开发一个展示页面。这些技术可以…

组合式API - provide和inject、Vue3小案例【Vue3】

组合式API - provide和inject 作用和场景&#xff1a;顶层组件向任意的底层组件传递数据和方法&#xff0c;实现跨层组件通信 跨层传递普通数据 顶层组件通过provide函数提供数据 provide(key, 顶层组件中的数据)底层组件通过inject函数获取数据 const message inject(key) …

每日学术速递6.14

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Realistic Saliency Guided Image Enhancement 标题&#xff1a;现实显着性引导图像增强 作者&#xff1a;S. Mahdi H. Miangoleh, Zoya Bylinskii, Eric Kee, Eli Shechtman, Ya…

js创建对象三种方式

创建对象三种方式 1、利用对象字面量创建对象2、利用 new Object 创建对象3、利用构造函数创建对象3.1 构造函数 1、利用对象字面量创建对象 const obj {name: 张三,age: 20 } console.log(obj)结果如下&#xff1a; 2、利用 new Object 创建对象 const obj new Object({…

Jmeter使用||接口测试实战

标题 Jmeter与postman一样&#xff0c;都可以用来进行接口测试。 前面的文章&#xff08; 测试工具介绍||Jmeter的简单使用&#xff09;&#xff0c;介绍了jmeter的下载、安装及简单使用。基于此背景&#xff0c;通过实例的形式&#xff0c;来介绍下如何利用jmeter进行接口测试…

Rancher集群containerd导出镜像

奇墨科技是国内领先的全域IT质量管理平台及服务商&#xff0c;创始团队为在ITSM、公有云&#xff0c;私有云&#xff0c;超融合及安全业务方向服务多年的业界精英团队&#xff0c;尤其具备领先的运维服务和业务理解能力&#xff0c;已服务了大量的世界及中国500强客户&#xff…

【深度学习】3-4 神经网络的学习- 学习算法的实现

神经网络的学习步骤如下所示&#xff1a; 步骤1(mini-batch) 从训练数据中随机选出一部分数据&#xff0c;目标是减小mini-batch的损失函数的值 步骤2(计算梯度) 为了减小mini-batch的损失函数的值&#xff0c;需要求出各个权重参数的梯度 步骤3(更新参数) 将权重参数沿梯度…

redhat 6.4安装oracle11g RAC (四)

创建集群数据库 在节点rac1上用oracle用户执行dbca创建RAC数据库 [rootrac1 ~]# su - oracle [oraclerac1 ~]$ dbca选择创建数据库 自定义数据库&#xff08;也可以是通用&#xff09; 配置类型选择Admin-Managed&#xff0c;输入全局数据库名orcl&#xff0c;每个节点实例SI…

java线上问题排查基本命令

1、jvm基本命令 1.1、java命令 1.1.1、简介 java命令启动java应用程序。它通过启动Java运行时环境&#xff08;JRE&#xff09;、加载指定的类并调用该类的main&#xff08;&#xff09;方法来实现这一点。 1.1.2、命令链接 https://docs.oracle.com/javase/8/docs/techno…