SpringBoot+Vue3实现文件上传功能
甲蛙全栈
共 1942字,需浏览 4分钟
· 2021-11-12
SpringBoot+Vue3实现文件上传功能,后端开发一个SpringBoot通用上传接口,前端使用Vue3的上传组件。
| 喜欢听我叨叨的,直接看视频 |
01
实现思路
1. 前端上传组件,html自带的file,Vue上传组件
https://2x.antdv.com/components/upload-cn#components-upload-demo-avatar
2. 后端接收,将图片保存到文件夹
SpringBoot通用的上传文件接口
3. 前端显示图片,将文件夹路径转为url
D:/file/wiki/xxx.jpg
D:/file/wiki/是文件目录
localhost:8880/file/xxx.jpg
02
相关代码
后端接口
@RequestMapping("/upload/avatar")
public CommonResp upload(@RequestParam MultipartFile avatar) throws IOException {
LOG.info("上传文件开始:{}", avatar);
LOG.info("文件名:{}", avatar.getOriginalFilename());
LOG.info("文件大小:{}", avatar.getSize());
// 保存文件到本地
String fileName = avatar.getOriginalFilename();
String fullPath = "D:/file/wiki/" + fileName;
File dest = new File(fullPath);
avatar.transferTo(dest);
LOG.info(dest.getAbsolutePath());
return new CommonResp();
}
HTML:
<a-upload
v-model:file-list="fileList"
name="avatar"
list-type="picture-card"
class="avatar-uploader"
:show-upload-list="false"
:action="SERVER + '/ebook/upload/avatar'"
:before-upload="beforeUpload"
@change="handleChange"
>
<img v-if="imageUrl" :src="imageUrl" alt="avatar" />
<div v-else>
<loading-outlined v-if="coverLoading">loading-outlined>
<plus-outlined v-else>plus-outlined>
<div class="ant-upload-text">Uploaddiv>
div>
a-upload>
JS:
function getBase64(img: Blob, callback: (base64Url: string) => void) {
const reader = new FileReader();
reader.addEventListener('load', () => callback(reader.result as string));
reader.readAsDataURL(img);
}
………………
const SERVER = process.env.VUE_APP_SERVER;
const fileList = ref([]);
const coverLoading = ref(false);
const imageUrl = ref('');
const handleChange = (info: any) => {
if (info.file.status === 'upcoverLoading') {
coverLoading.value = true;
return;
}
if (info.file.status === 'done') {
// Get this url from response in real world.
getBase64(info.file.originFileObj, (base64Url: string) => {
imageUrl.value = base64Url;
coverLoading.value = false;
});
ebook.value.cover = SERVER + "/file/" + info.file.name;
}
if (info.file.status === 'error') {
coverLoading.value = false;
message.error('upload error');
}
};
const beforeUpload = (file: any) => {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
if (!isJpgOrPng) {
message.error('You can only upload JPG file!');
}
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isLt2M) {
message.error('Image must smaller than 2MB!');
}
return isJpgOrPng && isLt2M;
};
—————— THE END ——————
扫码关注,好文不错过
评论
15种时间序列预测方法总结(包含多种方法代码实现)
向AI转型的程序员都关注了这个号👇👇👇在这篇文章中,我们将深入探讨时间序列预测的基本概念和方法。我们将首先介绍单元预测和多元预测的概念,然后详细介绍各种深度学习和传统机器学习方法如何应用于时间序列预测,包括循环神经网络(RNN)、一维卷积神经网络(1D-CNN)、Transformer、自回归模型(
机器学习AI算法工程
0
Go 1.22 的新增功能系列之二:reflect.TypeFor
Go 1.22 的第一个候选版本已经发布,这意味着最终版本即将发布,现在是我在博客中介绍我在这个周期中所做工作的时候了。像往常一样,我的贡献很小,但它们是我的,所以我将从幕后的角度来谈谈它们。首先是reflect.TypeFor。这是整个函数:// TypeFor returns the [Type
GoCN
0
SpringBoot 实现图片防盗链功能
程序员的成长之路互联网/程序员/技术/资料共享 关注阅读本文大概需要 4 分钟。来自:blog.csdn.net/weixin_46157208/article/details/138051737前言出于安全考虑,我们需要后端返回的图片只允许在某个网站内展示,不想被爬虫拿到图片地
程序员的成长之路
0
一站式解决方案:基于 Arthas 实现服务发现和权限控制
来源:juejin.cn/post/7281849496983994383👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接
小哈学Java
0
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
Go 1.22 的新增功能系列之一:cmp.Or
截至撰写本文时,Go 1.22 已经发布几个月了。早就该结束我为 1.22 所做的工作的系列了。抱歉耽搁了这么久,我最近忙于生活事务。如果您错过了我关于reflect.TypeFor(https://blog.carlana.net/post/2024/golang-reflect-type-for
GoCN
1
21.3K star!推荐一款可视化自动化测试/爬虫/数据采集神器!功能免费且强大!
【温馨提示】由于公众号更改了推送规则,不再按照时间顺序排列,如果不想错过测试开发技术精心准备的的干货文章,请将测试开发技术设为“星标☆”,看完文章在文尾处点亮“在看”!大家好,我是狂师!在大数据时代,信息的获取与分析变得尤为重要。对于开发者、数据分析师乃至非技术人员来说,能够高效地采集网络数据并进行
测试开发技术
4
知乎高问:程序员有必要知道为什么做某个功能吗?
将Python客栈设为“星标⭐”第一时间收到最新资讯前言知乎上有一个提问:程序员有必要知道为什么做某个功能吗?↓↓↓今天,我们就这个话题一起来做个讨论。不知道程序员的你,在接到产品经理提的一个需求后,是习惯马上动手开始撸代码呢?还是会先暂停一下,认真思考一会如下一些问题,比如这个需求产生的背景是什么
Python客栈
0