功能演示

我们要实现的功能如下,有两个按钮,点击第一个按钮选择文件,选择文件后点击第二个按钮上传到服务器。

功能需求:

  1. 只允许上传 pngjpg/jpeg 格式的图片

  2. 没有上传图片时显示占位图

  3. 选择完图片后在页面中渲染出来

构建页面

template

<template>
<div>
<div>
<!-- 选择图片后展示待上传的图片 -->
<img v-if="base64img" :src="base64img" />
<!-- ↓ 没有选择时显示占位图 -->
<img v-else="base64img" src="@/assets/placeholderImg.png" />
</div> <!-- 限制最大待上传的文件数量为 1 -->
<!-- 添加选择文件后的回调和移除待上传文件的回调 -->
<a-upload :before-upload="beforeUpload" :max-count="1" @remove="handleRemove">
<a-button>
<upload-outlined></upload-outlined>
Select File
</a-button>
</a-upload>
<!-- 点击上传按钮 -->
<a-button @click="triggerUpload" :loading="btnLoading">上传</a-button>
</div>

逻辑部分

TypeScript

import { UploadOutlined } from '@ant-design/icons-vue'
import fruitApi from "@/api/fruitApi";
import {ref} from "vue";
import {Upload} from "ant-design-vue";
import {Notice} from "@/utils/interfaces"; const fileList = ref();
// ↑ 待上传文件列表 (其实里面也就能放一个文件)
const base64img = ref();
// ↑ 我们在页面中显示待上传的图片的原理是
// 将所选择的本地图片转换为 Base64 编码
// 之后让图片的 src = base64img 来实现的
// 所以 base64img 就是一个储存图片编码的字符串
const btnLoading = ref<boolean>(false);
// ↑ 上传按钮的 loading 状态
// 在点击上传 至 获取服务器回调的时间内 按钮不可用 /**
* 对图片编码的函数
*/
function getBase64(img: Blob, callback: (base64Url: string) => void) {
const reader = new FileReader();
reader.addEventListener('load', () => callback(<string>reader.result));
// ↑ 监听 reader 的 load 事件,触发时执行回调函数
// 回调函数的作用就是将图片编码的base64字符串传给 base64img
reader.readAsDataURL(img);
} /**
* andv 上传文件的回调
* 返回 false 则不会上传文件,而是由我们手动上传
* 返回 Upload.LIST_IGNORE 会取消将文件添加至待上传列表
* @param file 所选择的文件
*/
function beforeUpload(file: any) {
console.log(file);
// 判断文件是否为图片格式
const isImg = (file.type === 'image/jpeg' || file.type === 'image/png'); // 如果文件不是图片格式则禁止上传
if (!isImg) {
Notice.error("只能上传 jpeg/jpg/png 格式的文件!");
// ↑ Notice.error 是我自己写的 Notice 类的一个静态函数
// 用的是 antdv 的 Notifiacation
return Upload.LIST_IGNORE;
}
fileList.value = file;
// ↓ 获取所需要上传图片的 Base64 编码
getBase64(fileList.value, (cb_img: string) => {
// 将获取到的所要上传图片的 Base64 编码渲染到图片上
base64img.value = cb_img;
})
return false;
} /**
* 点击上传按钮的回调
*/
function triggerUpload() {
const formData = new FormData(); // 对文件列表 判空
if (fileList.value != null) {
formData.append("file", fileList.value as any);
} else {
Notice.error("文件不能为空!")
return Upload.LIST_IGNORE;
} // ↓ 在上传过程中,按钮为 loading 状态
btnLoading.value = true; // 请求上传接口
fruitApi({
method: 'put',
url: 'api/upload',
data: formData
})
.then((resp: any) => {
console.log(resp);
if (resp.code === 1) {
Notice.success(<string>resp.data);
changeUploadItemColor("#49aa19");
} else {
Notice.error("上传失败~");
changeUploadItemColor("#ff4d4f");
// ↑ 下面会提到这个函数
}
btnLoading.value = false;
})
.catch((err) => {
console.log(err);
Notice.error("发生了错误~");
btnLoading.value = false;
changeUploadItemColor("#ff4d4f");
})
} /**
* 待上传图片被删除的回调
*/
function handleRemove() {
fileList.value = null;
// ↑ 置空待上传文件列表
base64img.value = null;
// ↑ 显示默认占位图
} /**
* 上传图片成功或失败后 list 变色的函数
*/
type uploadItemColor = "#49aa19" | "#ff4d4f";
// ↑ 两个颜色 绿 和 红
function changeUploadItemColor(color: uploadItemColor) {
const uploadListItem = document.querySelector(".ant-upload-list-item-name");
// ↑ 类名是 antdv 规定的,选择这个类名即可
(uploadListItem as any).style.color = color;
// ↑ 使item文字变色
}

这次真的是把 TypeScript 写成了 anyScript,中间不知道用了多少的类型断言和 :any

End

开头已经展示过页面效果啦,就不再测试了

Ant-Design-Vue 图片上传的更多相关文章

  1. Ant Design Upload 组件上传文件到云服务器 - 七牛云、腾讯云和阿里云的分别实现

    在前端项目中经常遇到上传文件的需求,ant design 作为 react 的前端框架,提供的 upload 组件为上传文件提供了很大的方便,官方提供的各种形式的上传基本上可以覆盖大多数的场景,但是对 ...

  2. vue图片上传组件

    前言:很多项目中都需要用到图片上传功能,而其多处使用的要求,为了避免重复造轮子,让我决定花费一些时间去深入了解,最终封装了一个vue的图片上传组件.现将总结再次,希望有帮助. Layout <d ...

  3. vue 图片上传

    功能说明: 1.调用手机拍照功能 2.调用相册功能 3.图片上传功能 4.图片预览功能 5.图片删除功能 关键点: .input 新增multiple .accept="image/*处理I ...

  4. vue 图片上传功能

    这次做了vue页面的图片上传功能,不带裁剪功能的! 首先是html代码,在input框上添加change事件,如下:   <ul class="clearfix">   ...

  5. vue图片上传的简单组件

    <template> <div class="rili" id="rili"> <div class="updel&qu ...

  6. 保姆级SpringBoot+Vue图片上传到阿里云OSS教程

    小二是新来的实习生,作为技术 leader,我给他安排了一个非常简单的练手任务,把前端 markdown 编辑器里上传的图片保存到服务器端,结果他真的就把图片直接保存到了服务器上,这下可把我气坏了,就 ...

  7. vue图片上传

    之前花了两个月用vue做了一个建筑照片我的webApp,前端就我一人,负责用vue写页面对接接口,后台一个程序员负责写接口,嵌套个安卓ios的壳.搞的是风风火火,过程也是很心累,大多不在技术,在于所谓 ...

  8. vue图片上传到七牛云

    代码: <template> <div class="upload-info"> <div> <el-upload class=" ...

  9. vue图片上传及java存储图片(亲测可用)

    1.前言 在使用elementui的upload组件时,我一直无法做到上传的图片和其他数据一起提交.单纯的上传文件,java的存储图片的方式也有局限性. 我知道的后端保存图片有两种方式:一种是直接存储 ...

  10. 后台管理系统之“图片上传” --vue

    图片上传(基于vue) 相信上传图片是所有系统必备的功能吧,工作中的第一个管理系统就在上传图片的功能上卡顿了一整天. 当时用的elementUI组件,但是由于样式和设计图样式差别较大再加上原生相较好理 ...

随机推荐

  1. DuiLib的编译

    Duilib编译需要注意两点: 加入预处理器:WIN32;_DEBUG;_WINDOWS;UILIB_STATIC; 到这一步还是报错,报错的是DuiString  +=  这一行报错,还有Util这 ...

  2. STM32F103 SPI详解及示例代码

    1 SPI协议详解 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串 ...

  3. web3 产品介绍 MyEtherWallet 方便和智能合约交互的钱包

    MyEtherWallet(简称MEW)是一款流行的去中心化以太坊钱包,它允许用户在安全且简单的界面中管理自己的以太坊资产.在本文中,我们将介绍MyEtherWallet的主要特点.功能以及如何使用它 ...

  4. 【Vue】可编辑表格与三级联动下拉

    需求是给员工分配岗位,设计上是一人多岗的存在... 单位 -- 部门 -- 岗位 这样的层级 功能效果: 因为员工可以在不同的单位下任职岗位,所以这个每一个岗位都是一个独立 查询单位列表是固定的,但是 ...

  5. 【SpringMVC】06 转发 & 重定向

    除了快速入门的视图解析器方式处理, 我们还可以使用原生的Servlet转发方式执行 访问测试 还有重定向 访问 测试 使用SpringMVC的转发&重定向 和原生的重定向,有一点不同,MVC的 ...

  6. NVIDIA机器人仿真环境 —— NVIDIA Isaac Sim 的headless模式/无头模式 —— 非桌面模式、非可视化模式

    相关: https://developer.nvidia.com/isaac-sim 可视化模式,也就是在桌面系统上直接安装软件,具体地址: https://developer.nvidia.com/ ...

  7. 【英伟达】GTC 2024|黄仁勋2小时演讲精华版|六大亮点| Blackwell GPU | DGX B200 | NVL72 | cuLitho | GROOT | Omniverse Cloud —— 智能机器人元年

    视频地址: https://www.youtube.com/watch?v=zBIddyiMXsU

  8. VSCode 如何将已编辑好的python文件中的 tab 键缩进转换成4个空格键缩进

    事情起源: 使用vscode维护一个7年前的python项目,发现编辑后运行报错,提示缩进错误,原因是当时的项目使用tab做缩进,而我正在用的vscode是使用4空格做缩进,因此造成了缩进不匹配的问题 ...

  9. 13. Advanced-control timers (TIM1 and TIM8)

    1. 基本介绍 有三个基础的寄存器: 计数寄存器(TIMx_CNT,Counter register) 预分频寄存器(TIMx_PSC,Prescaler register) 自动重载寄存器(TIMx ...

  10. 手把手教Linux驱动5-自旋锁、信号量、互斥体概述

    在Linux系统中有大量的临界资源需要保护,如何让各个任务有条不紊的访问这些资源,这涉及到Linux中并发访问的保护机制设计相关知识.后面会详细介绍这几个机制. (据可靠消息,锁的实现经常出现在笔试环 ...