Ant-Design-Vue 图片上传
功能演示
我们要实现的功能如下,有两个按钮,点击第一个按钮选择文件,选择文件后点击第二个按钮上传到服务器。
功能需求:
只允许上传
png、jpg/jpeg格式的图片没有上传图片时显示占位图
选择完图片后在页面中渲染出来




构建页面
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 图片上传的更多相关文章
- Ant Design Upload 组件上传文件到云服务器 - 七牛云、腾讯云和阿里云的分别实现
在前端项目中经常遇到上传文件的需求,ant design 作为 react 的前端框架,提供的 upload 组件为上传文件提供了很大的方便,官方提供的各种形式的上传基本上可以覆盖大多数的场景,但是对 ...
- vue图片上传组件
前言:很多项目中都需要用到图片上传功能,而其多处使用的要求,为了避免重复造轮子,让我决定花费一些时间去深入了解,最终封装了一个vue的图片上传组件.现将总结再次,希望有帮助. Layout <d ...
- vue 图片上传
功能说明: 1.调用手机拍照功能 2.调用相册功能 3.图片上传功能 4.图片预览功能 5.图片删除功能 关键点: .input 新增multiple .accept="image/*处理I ...
- vue 图片上传功能
这次做了vue页面的图片上传功能,不带裁剪功能的! 首先是html代码,在input框上添加change事件,如下: <ul class="clearfix"> ...
- vue图片上传的简单组件
<template> <div class="rili" id="rili"> <div class="updel&qu ...
- 保姆级SpringBoot+Vue图片上传到阿里云OSS教程
小二是新来的实习生,作为技术 leader,我给他安排了一个非常简单的练手任务,把前端 markdown 编辑器里上传的图片保存到服务器端,结果他真的就把图片直接保存到了服务器上,这下可把我气坏了,就 ...
- vue图片上传
之前花了两个月用vue做了一个建筑照片我的webApp,前端就我一人,负责用vue写页面对接接口,后台一个程序员负责写接口,嵌套个安卓ios的壳.搞的是风风火火,过程也是很心累,大多不在技术,在于所谓 ...
- vue图片上传到七牛云
代码: <template> <div class="upload-info"> <div> <el-upload class=" ...
- vue图片上传及java存储图片(亲测可用)
1.前言 在使用elementui的upload组件时,我一直无法做到上传的图片和其他数据一起提交.单纯的上传文件,java的存储图片的方式也有局限性. 我知道的后端保存图片有两种方式:一种是直接存储 ...
- 后台管理系统之“图片上传” --vue
图片上传(基于vue) 相信上传图片是所有系统必备的功能吧,工作中的第一个管理系统就在上传图片的功能上卡顿了一整天. 当时用的elementUI组件,但是由于样式和设计图样式差别较大再加上原生相较好理 ...
随机推荐
- 2024 Selenium10个替代品
随着自动化测试需求的不断增长,Selenium作为广泛使用的自动化测试工具,虽然功能强大,但也存在一些限制和挑战.在2024年, 越来越多的替代工具涌现,它们提供了更高效.更易用的解决方案.那么,哪些 ...
- 硬件开发笔记(二十八):TPS54331电源设计(一):5V电源供电原理图设计
前言 电源供电电路设计很重要,为了更好的给对硬件设计有需求的人,特意将电源设计的基础过程描述出来. 本篇描述设计常用的12V转5V电路3A. TPS54331(DC-DC稳压器) 概述 ...
- layout文本相关
Textview t=findViewById(R.id.t); ONE设置文本内容: 在XML中android:text直接写 在java中setText()中修改 注意点1继承appcompata ...
- RHCA rh442 008 oom 故障触发器 内存溢出 swap numa tmpfs shm
OOM out-of-memory killer 进程被莫名其妙杀死 所有内存加swap为活动 zone_normal 没空间 (目前64G时代可以不考虑这个) 溢出就死机 内存溢出前,去杀死进程 因 ...
- Linux 有趣命令
代码雨 1.上传软件包 Linux 获取 wget https://jaist.dl.sourceforge.net/project/cmatrix/cmatrix/1.2a/cmatrix-1.2a ...
- 2、Git之Windows版本的安装
2.1.下载Git 官网下载地址:https://git-scm.com/download/ 最初,Git 是用于管理 Linux 社区的代码,所以在很长的一段时间内,Git 只能安装在 Linux ...
- 【Mybatis】06 Session获取 & 配置参数总结
会话获取 SqlSessionFactory 最佳的获取方式就是使用Mybatis提供的资源类加载配置文件 调用会话工厂建造者实例的建造方法注入读取流 要注意的是建造者生成了了实例就可以不需要了 这里 ...
- 个人的谷歌学术主页:https://scholar.google.co.kr/citations?user=jHvm-VAAAAAJ&hl=en
主页地址: https://scholar.google.co.kr/citations?user=jHvm-VAAAAAJ&hl=en
- windows10操作系统QQ音乐开全局音效后频繁出现报错,鼠标卡顿,系统死机等问题——解决方法
如题: windows10操作系统QQ音乐开全局音效后频繁出现报错,鼠标卡顿,系统死机等问题. QQ音乐,开启全局音效,提示需要重启: 重启电脑后发现出现频繁卡机,鼠标卡顿,甚至短暂的死机现象,查看控 ...
- java:找不到符号(使用lombok)
1.背景 启动报错: Error:(76, 34) java: 找不到符号 符号: 方法 getOrderNo() 位置: 类型为XXXXX.request.coupon.SubmitOrderObj ...