Springboot3+Vue3实现文件上传下载功能

news/2025/4/2 12:13:31/文章来源:https://www.cnblogs.com/shidawuyu/p/18803328

文件上传

//System.getProperty("user.dir")获取到当前项目的根路径//文件上传的目录路径private static final String filePath=System.getProperty("user.dir")+"/files";/*** 文件上传* @param file* @return*/@PostMapping("/upload")public Result upload(MultipartFile file){//文件流的形式接受前端发送过来的文件String originalFilename = file.getOriginalFilename(); //xxx.pngif (!FileUtil.isDirectory(filePath)){//如果目录不存在需要先创建目录FileUtil.mkdir(filePath);//创建一个files目录
        }//提供文件存储的完整的路径//给文件名加一个唯一的标识String fileName=System.currentTimeMillis() + "_" +originalFilename;//1234566721_xxx.pngString realPath=filePath+fileName;try{FileUtil.writeBytes(file.getBytes(),realPath);} catch (IOException e) {e.printStackTrace();throw new CustomException("500","文件上传失败");}//返回一个网络链接//http://localhost:8080/files/download/xxx.pngString url="http://localhost:8080/files/download/"+fileName;return Result.success(url);}

文件下载

/*** 文件下载*/@GetMapping("/download/{fileName}")public void download(@PathVariable String fileName, HttpServletResponse response){try {//response设置统一的文件名称,设置成utf-8编码response.addHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName, StandardCharsets.UTF_8));response.setContentType("application/octet-stream");OutputStream os = response.getOutputStream();String realPath=filePath+fileName;//完整的文件路径//获取到文件的字节数组byte[] bytes=FileUtil.readBytes(realPath);os.write(bytes);os.flush();os.close();} catch (IOException e) {e.printStackTrace();throw new CustomException("500","文件下载失败");}}
//response设置统一的文件名称,设置成utf-8编码response.addHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName, StandardCharsets.UTF_8));response.setContentType("application/octet-stream");

前端对接文件上传下载

 upload组件

<el-form-item label="头像"><div style="width: 100%;display: flex;justify-content: center;margin-bottom: 20px"><el-uploadclass="avatar-uploader"action="http://localhost:8080/files/upload":show-file-list="false":on-success="handleAvatarSuccess"><img v-if="data.form.avatar" :src="data.form.avatar" class="avatar" /><el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon></el-upload></div></el-form-item>

回调函数

const handleAvatarSuccess = (res) => {console.log(res.data)data.form.avatar=res.data
}

表格里面显示图片

<el-table-column label="照片"><template #default="scope"><img v-if="scope.row.avatar" :src="scope.row.avatar" alt="" style="width: 40px;height: 40px" /></template></el-table-column>

上传头像表单

<el-form-item label="照片"><el-uploadclass="avatar-uploader"action="http://localhost:8080/files/upload"list-type="picture":on-success="handleAvatarSuccess"><el-button type="primary">上传头像</el-button></el-upload></el-form-item>
const handleAvatarSuccess = (res) => {console.log(res.data)data.form.avatar=res.data
}

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

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

相关文章

【THM】Alfred 阿尔弗雷德

【THM】 Alfred 阿尔弗雷德 Initial Access 初始访问在这个房间,我们将学习如何利用广泛使用的自动化服务器(Jenkins - 此工具用于创建持续集成/持续开发管道,允许开发者在对其代码进行更改后自动部署代码)上的常见配置错误。之后,我们将使用一种有趣的权限提升方法来获取…

从零开始编译安装Nginx:详细步骤与实战配置(附避坑指南)——基于CentOS 7的保姆级教程

一、为什么需要创建专用Nginx用户? 在Linux系统中,为服务创建独立的运行用户是安全最佳实践。Nginx默认以nobody用户运行,但通过创建专用用户nginx,可以限制其权限,防止潜在的安全漏洞影响系统其他部分。 操作步骤: # 创建不可登录的nginx用户(-M不创建家目录,-s指定不…

3.31 格林公式及其应用

1.1 类比 一元函数的积分可以通过两个边界的函数表示 二元函数的积分就可以通过曲线的积分表示1.2 例题例题2(不完全封闭的写法

ArkTs的@Watch状态监听

@Watch装饰器:监听并捕捉变量变化@Watch用于监听状态变量的变化,当状态变量变化时,@Watch的回调方法将被调用。@Watch在ArkUI框架内部判断数值有无更新使用的是严格相等(===),监听并捕捉变量变化。 前端同学以Vue中的Watch监听为嵌入点更好理解。 装饰器说明装饰器参数: …

@Resource 和 @Autowired 的区别

@Autowired 和 @Resource 都用于在 Spring 中进行依赖注入,但在来源、注入方式、支持的参数和用法上存在一些差异。​1、来源不同@Autowired:​Spring 自身提供的注解,位于 org.springframework.beans.factory.annotation 包中。​ @Resource:​Java标准中的注解,位于 jav…

harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)

大家好!我是黑臂麒麟,一位6年的前端;if youre change the world, youre workingon important things. youre excited to get up in the norning.一、常用基础组件 1.基础组件 简单列举常用的及含义,掌握了以下按钮可以解决日常简单场景需求。其他在使用时查询ArkTS的API文…

ai出错、不严谨的体验

一、例子1 用一个包含80多名学生成绩的PDF文件,让ai对学生成绩进行加减乘除的计算(保留两位小数),计算结果降序排列。结果部分学生的结果计算错误(最大差距有3分左右),部分学生的结果是正确的 我不知道是不是因为涉及到除法导致部分结果出错,我用了元宝deeepseek和豆包…

第5章 编写异步代码

第5章 编写异步代码 5.1 异步函数简介 C# 5 引入了异步函数的概念。异步函数可以指某个由 async 修饰符修饰的方法或者匿名函数,它可以对 await 表达式使用 await 运算符。 5.2 对异步模式的思考 5.2.1 关于异步执行本质的思考 await 在 C#中的任务本质上是请求编译器为我们创…

Spring Cloud Gateway 与 Knife4j 集成实践

注意:写于 2025/1/10,未来时间可能失效,请根据具体情况实践。在微服务架构中,Gateway 通常承担着路由转发、负载均衡、鉴权等职责,而 Knife4j 是一个集 Swagger2 和 OpenAPI3 为一体的增强解决方案,可以帮助开发者快速聚合使用OpenAPI 规范。 本文参考 Knife4j 文档,进行…

用户说:10分钟用通义灵码搞定“今天穿什么”!打开爽文世界……

当我仅用10分钟调教出一个会关心我穿不穿秋裤的管家时,突然想到,现在限制我们开发的已经不是编程能力,而在于你有没有把你的想象力塞进代码框!作者:ZLJ,浙江大学教育技术学研究生 当我仅用10分钟调教出一个会关心我穿不穿秋裤的管家时,突然想到,现在限制我们开发的已经…

Cyber Apocalypse 2025 forensics WP

Cyber Apocalypse 2025 forensics WPCyber Apocalypse 2025 WP 做了国际赛之后虽然(目前只做了两道,可是没环境了啊,前几天比赛有点多~www),只从取证这边说,感觉他们的题很有趣,情境也给的很真实连贯,出题灵活,就是能见到很多新兴的知识,拓展知识面,以后会多看一看…

python第六周作业(第四章课后程序练习题)

4.1 import random def guess_number(): target = random.randint(1, 100) count = 0 while True:guess = int(input("请输入你猜的数字(1-100): "))count += 1if guess < target:print("猜小了")elif guess > target:print("猜大了")else…