【RuoYi】实现文件的上传与下载

一、前言

   首先,最近在做一个管理系统,里面刚好需要用到echarts图和富文本编辑器,然后我自己去看了官网觉得有点不好懂,于是去B站看来很多视频,然后看到了up主【程序员青戈】的视频,看了他讲的echarts图和富文本编辑器部分的内容,觉得讲的很好,很推荐大家去观看他的视频。然后在富文本编辑器这部分内容中,需要用到,文件上传与下载的部分知识,所以这里做一个笔记,来记录关于这部得分的内容,echarts图和富文本编辑器部分的内容也会在后面的博客中介绍。希望对大家有所帮助啦~

二、准备工作

   导入hutool的依赖

        <!--hutool工具类--><!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency>

三、文件上传与下载代码

   如下所示,是跟着青戈学的已经封装好的代码,大家可以直接拿来用。但是需要注意的是,我用的是RuoYi的框架,所以最后返回的是RuoYi封装好的AjaxResult结果集,而不是青戈自己写的Result结果集,就这里需要注意以下。

@RestController
@Api(tags = "文件上传与下载模块")
@RequestMapping("/file")
public class FileController extends BaseController {@Value("${ip:localhost}")String ip;//通过配置文件拿到ip@Value("${server.port}")String port;private static final String ROOT_PATH = System.getProperty("user.dir")+ File.separator+"files";//文件根目录@ApiOperation(value = "文件上传")@PostMapping("/upload")public AjaxResult Upload(@RequestPart("file") MultipartFile file) throws IOException {//MultipartFile file 输入的文件String originalFilename = file.getOriginalFilename();//originalFilename是获取源文件名String mainName = FileUtil.mainName(originalFilename);// mainName 是主文件名String extName = FileUtil.extName(originalFilename);//extName 是文件的标识 png、pdf等if(!FileUtil.exist(ROOT_PATH)){//通过hutool工具类中的FileUtil来判断我们的根目录是否存在,若不存在则在根目录下创建file文件夹FileUtil.mkdir(ROOT_PATH);}//判断file文件夹中传入的文件是否存在,若存在为了防止重名不被替换,则需要对文件重新命名if(FileUtil.exist(ROOT_PATH+File.separator+originalFilename)){originalFilename=System.currentTimeMillis()+"_"+mainName+"."+extName;}File saveFile = new File(ROOT_PATH + File.separator + originalFilename);//创建一个file文件对象,方便写入磁盘file.transferTo(saveFile);//存储文件到本地磁盘里面去String url ="http://"+ip+":"+port+"/file/download/"+originalFilename;//问价下载的路径return AjaxResult.success(url);//RuoYi自带的结果集}@ApiOperation(value = "文件下载")@GetMapping("/download/{fileName}")public void download(@PathVariable String fileName, HttpServletResponse response) throws IOException {
//        response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));//文件下载response.addHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(fileName,"UTF-8"));//文件预览String filePath = ROOT_PATH+File.separator+fileName;//拿到文件的路径if(!FileUtil.exist(filePath)){//文件不存在,就不用管,因为没有东西可写return;}byte[] bytes = FileUtil.readBytes(filePath);//使用FileUtil从filePath中去读取文件ServletOutputStream outputStream = response.getOutputStream();outputStream.write(bytes);//把文件的字节数写出去outputStream.flush();//刷新一下outputStream.close();//一定要关闭文件流}
}

接口测试

我们在测试接口时,可以直接使用RuoYi框架为我们提供的Swagger来测试接口,当然也可以用PostMan,看个人的习惯来定了。

bbe54ea0ff974437a3f132f5fe6e4682.png

a6711e0d31e147cba7d4d9d88e5f4805.png

8a7c4224decc43f6beff175d7cbf0dc1.png

文件上传成功返回码为200,而且在Idea中生成file文件夹

1242212e892b4a4c9a311d464e4791e0.png

57a9f1faf2304ae78ca45bd3552d37e3.png

到此我们的文件上传与下载的接口就完成了,接下来我们来看看如何在前端使用我们的该功能。

四、实践

①单文件上传

da561baecfeb49de9762768906024a99.png

如上图所示,我们现在要完成一个点击功能,从而实现用户头像的上传与显示,这个功能也是我们在做项目中很常见的功能。

思路:上传图片->保存数据库->再从数据库拿到图片路径

先完成文件的上传:

05f047e215dc457885107c79fd926ed3.png

注意:我们使用的是RuoYi框架中的AjaxResult结果集,返回的数据是在response下的msg中

bf68590f7fa04edfa67326fb10bbb101.png

JS中代码

    handleTableFileUpload(row,file,fileList){console.log(row,file)row.stuAvatar=file.response.msg//注意我们使用的是RuoYi框架中的AjaxResult结果集,返回的数据是在response下的msg中//触发更新//使用RuoYi中封装好的updateStudent()函数,将当前对象更新updateStudent(row).then(response => {if(response.code=='200'){this.$message.success("上传成功")}else{this.$message.success("上传失败")}this.form = response.data;});}

头像显示代码:

7cd6da79d60a4fc694edec61a9fa41d0.png

效果如下:

8fa802193bf14a8e9bcc4058517616ad.png

②多文件上传

多文件其实是基于单文件的,就是在单文件的基础上,多次请求即可。我们也可以做个简单的案例测试。先在element-ui随便找一个文件上传的前端页面,如下图所示:

b15d1a2133634dcc904d108af8057a05.png

放在我们的RuoYi的项目中:

2a01bafe498047b691df4e098c9116ee.png

400e8f62200e4730ad4d25a0ffc7bcc0.png

12b6eeabdec94234bd1b3455f7c98009.png

测试:

74b57ed4df6f43ed9b7d584848596aff.png

a4c3d68d69704cc4aed5f279629a5995.png

如上图所示,我们可以成功的拿到三张图片的地址,此时我们只需要,将其存入数据库,再从数据库中拿出来显示即可,大家下来试一试即可,我这里就不做测试了。

五、总结

   跟着青戈学习了这个文件上传与下载的的视频,自己真的学到了很多,这个文件上传下载的功能不仅适用于图片,也可以用在pdf、word等文件中,也希望这些内可以帮助屏幕前的小伙伴们,如果有所帮助,别忘了点赞、关注一波哦~

 

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

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

相关文章

利用Python处理DAX多条件替换

小A&#xff1a;白茶&#xff0c;救命啊~~~ 白茶&#xff1a;什么情况&#xff1f; 小A&#xff1a;是这样的&#xff0c;最近不是临近项目上线嘛&#xff0c;有一大波度量值需要进行类似的调整&#xff0c;一个两个倒没啥&#xff0c;600多个&#xff0c;兄弟&#xff0c;救命…

从JS角度直观理解递归的本质

让我们写一个函数 pow(x, n)&#xff0c;它可以计算 x 的 n 次方。换句话说就是&#xff0c;x 乘以自身 n 次。 有两种实现方式。 迭代思路&#xff1a;使用 for 循环&#xff1a; function pow(x, n) {let result 1;// 在循环中&#xff0c;用 x 乘以 result n 次for (let i…

opencv进阶 ——(九)图像处理之人脸修复祛马赛克算法CodeFormer

算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型&#xff0c;由南洋理工大学和商汤科技联合研究中心联合开发&#xff0c;它能够接收模糊或马赛克图像作为输入&#xff0c;并生成更清晰的原始图像。算法源码地址&#xff1a;https://github.com/sczhou/CodeFormer…

如何快速找到 RCE

背景介绍 本文将分享国外白帽子在‘侦察’阶段如何快速发现 RCE 漏洞的经历。以Apache ActiveMQ 的 CVE-2023–46604 为特例&#xff0c;重点介绍如何发现类似此类的漏洞&#xff0c;让我们开始吧。 快速发现过程 在‘侦察’阶段&#xff0c;白帽小哥会保持每周更新一次目标…

1940java swing零售库存管理系统myeclipse开发Mysql数据库CS结构java编程

一、源码特点 java swing 零售库存管理系统 是一套完善的窗体设计系统&#xff0c;对理解SWING java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;&#xff0c;系统主要采用C/S模式开发。 应用技术&#xff1a;javamysql 开发工具&#xff1a;…

适合技术小白学习的项目1863java在线视频网站系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java在线视频网站系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。 开发环境为TOMCAT7.0,Myeclipse8.5开发…

数据库、数据表的基本操作

1.数据库的基本操作 &#xff08;1&#xff09;创建数据库 &#xff08;2&#xff09;删除数据库 &#xff08;3&#xff09;将数据库的字符集修改为gbk gbk是汉字内码扩展规范&#xff0c;是GB2312和GB13000的扩展&#xff0c;主要用于简体中文。 &#xff08;4&#xff09;…

LabVIEW在高校电力电子实验中的应用

概述&#xff1a;本文介绍了如何利用LabVIEW优化高校电力电子实验&#xff0c;通过图形化编程实现参数调节、实时数据监控与存储&#xff0c;并与Simulink联动&#xff0c;提高实验效率和数据处理能力。 需求背景高校实验室在进行电机拖动和电力电子实验时&#xff0c;通常使用…

前端框架安全防范

前端框架安全防范 在现代Web开发中&#xff0c;前端框架如Angular和React已经成为构建复杂单页面应用&#xff08;SPA&#xff09;的主流工具。然而&#xff0c;随着应用复杂度的增加&#xff0c;安全问题也变得越来越重要。本文将介绍如何在使用Angular和React框架时&#xf…

施耐德 BAS PLC 基本操作指南

CPU 型号 项目使用的 PLC 型号为&#xff1a;施耐德昆腾 Quantum 140 CPU 67160 P266 CPU &#xff0c;支持热备冗余&#xff0c;内部存储 1024K&#xff0c;支持 2 个 PCMCIA 扩展卡槽CPU 模块自带接口&#xff1a;MB 串口接口、MB 串口接口、USB 接口、以太网接口&#xff…

【HarmonyOS】List组件多层对象嵌套ForEach渲染更新的处理

【HarmonyOS】List组件多层对象嵌套ForEach渲染更新的处理 问题背景&#xff1a; 在鸿蒙中UI更新渲染的机制&#xff0c;与传统的Android IOS应用开发相比。开发会简单许多&#xff0c;开发效率提升显著。 一般传统应用开发的流程处理分为三步&#xff1a;1.画UI&#xff0c;…

TiDB-从0到1-分布式存储

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCC 一、TiDB-DML语句执行流程&#xff08;增删改&#xff09; DML流程概要 1、协议验证 用户连接到TiDB Server后首先工作的是Protocol Layer模块&#xff0c;该模块会对用…

mysql表字段超过多少影响性能 mysql表多少效率会下降

一直有传言说&#xff0c;MySQL 表的数据只要超过 2000 万行&#xff0c;其性能就会下降。而本文作者用实验分析证明&#xff1a;至少在 2023 年&#xff0c;这已不再是 MySQL 表的有效软限制。 传言 互联网上有一则传言说&#xff0c;我们应该避免单个 MySQL 表中的数据超过 …

内网渗透-在HTTP协议层面绕过WAF

进入正题&#xff0c;随着安全意思增强&#xff0c;各企业对自己的网站也更加注重安全性。但很多web应用因为老旧&#xff0c;或贪图方便想以最小代价保证应用安全&#xff0c;就只仅仅给服务器安装waf。 本次从协议层面绕过waf实验用sql注入演示&#xff0c;但不限于实际应用…

[数据集][目标检测]轮胎检测数据集VOC+YOLO格式439张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;439 标注数量(xml文件个数)&#xff1a;439 标注数量(txt文件个数)&#xff1a;439 标注类别…

颠仆流离学二叉树2 (Java篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

泛型知识汇总

演示代码&#xff1a; package exercise;import java.util.Arrays;public class MyArrayList<E> {Object[] obj new Object[10];int size;public boolean add(E e) {obj[size] e;size;return true;}public E get(int index) {return (E) obj[index];}//没有这个函数&a…

现代信号处理12_谱估计的4种方法(CSDN_20240602)

Slepian Spectral Estimator(1950) 做谱估计的目标是尽可能看清楚信号功率谱在某一个频率上的情况&#xff0c;假设我们想了解零频时的分布&#xff0c;最理想的情况是滤波器的传递函数H(ω) 是一个冲激函数&#xff0c;这样就没有旁瓣&#xff0c;也就没有泄漏&#xff1b;其次…

【OpenHarmony】TypeScript 语法 ③ ( 条件语句 | if else 语句 | switch case 语句 )

文章目录 一、条件语句1、if else 语句2、switch case 语句 参考文档 : <HarmonyOS第一课>ArkTS开发语言介绍 一、条件语句 1、if else 语句 TypeScript 中的 if 语句 / if else 语句 用法 , 与 JavaScript 语言中的 if 语句 / if else 语句 语法 基本相同 ; if else 语…

项目质量管理

目录 1.概述 2.三个关键过程 2.1.规划质量管理&#xff08;Plan Quality Management&#xff09; 2.2.管理质量&#xff08;Manage Quality&#xff09; 2.3.控制质量&#xff08;Control Quality&#xff09; 3.应用场景 3.1.十个应用场景 3.2.产品设计与开发 4.小结…