Spring Boot+Vue+ElementUI实现文件的上传和下载到本地 并将 文件信息存入数据库

article/2025/9/29 9:23:29

🎈 1 参考文档

springboot 文件MultipartFile上传路径问题 | 橙熟^ _ ^-CSDN(原本采用绝对路径,参考该文章改成相对路径)

组件 | Element


🚀2 导入依赖和配置application.yml文件

2.1 在pom.xml中导入依赖

采用了mybatis-plus,需要导入依赖。

<!-- mybatis-plus-boot-starter -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>

2.2 导入依赖配置application.yml文件

server:port: 8800
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/数据库名?serverTimezone=GMT%2B8username: rootpassword: 123456
mybatis-plus:# mapper扫描mapper-locations: classpath*:mapper/**/*.xmlconfiguration:# 打印sqllog-impl: org.apache.ibatis.logging.stdout.StdOutImplfiles:upload:# 文件相对路径path: ./src/main/resources/images/

🚀3 创建数据库表和创建实体类

3.1 创建数据库files表

DROP TABLE IF EXISTS `files`;
CREATE TABLE `files`  (`id` int NOT NULL AUTO_INCREMENT COMMENT '文件id',`files_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件名称',`type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件类型',`size` double(32, 2) NULL DEFAULT NULL COMMENT '文件大小(KB)',`url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '下载链接',`md5` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文件md5',`enable` tinyint NULL DEFAULT 1 COMMENT '链接是否可用(1:是 0:否)',`is_delete` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除(1:是 0:否)',`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',`update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE,INDEX `name`(`files_name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '文件表' ROW_FORMAT = Dynamic;

3.2 创建实体类Files

@Data
@TableName("files")
public class Files implements Serializable {@TableId(type = IdType.AUTO)private Integer id;//编号private String filesName;//文件名称private String type;//文件类型private Double size;//文件大小private String url;//下载链接private String md5;//文件MD5private Boolean enable;//链接是否可用(1:是 0:否)@TableField(fill = FieldFill.INSERT)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date createTime;//创建时间@TableField(fill = FieldFill.INSERT_UPDATE)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date updateTime;//更新时间@TableLogic()private Integer isDelete;//是否删除(1:是 0:否)
}

🚀4 创建Mapper层

4.1 创建FilesMapper。

@Mapper
public interface FilesMapper extends BaseMapper<Files> {}

4.2 创建FilesMapper.xml。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hyc.nsms.mapper.FilesMapper"></mapper>

🚀5 创建业务层

5.1 创建FilesService

public interface FilesService extends IService<Files> {//上传文件String upload(MultipartFile file);//下载文件void download(String filesUUID, HttpServletResponse response);
}

5.2 创建FilesServiceImpl

@Service
public class FilesServiceImpl extends ServiceImpl<FilesMapper, Files> implements FilesService {@Value("${files.upload.path}")private String filesUploadPath;//获取文件路径@Overridepublic String upload(MultipartFile file) {//将相对路径转化为绝对路径String destPath = new File(filesUploadPath).getAbsolutePath();//文件夹路径名称String originalFilename = file.getOriginalFilename();//文件大小double size = file.getSize();//文件类型String type = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();//使用uuid生成随机唯一值String uuid = UUID.randomUUID().toString().replaceAll("-", "");//新的文件名称,uuid+文件类型String fileUuid = uuid + "." + type;//新的文件地址,绝对路径+新的文件名称File uploadFile = new File(destPath + "/" + fileUuid);//判断配置的文件目录是否存在,若不存在则创建一个新的文件目录File parentFile = uploadFile.getParentFile();if (!parentFile.exists()) {parentFile.mkdirs();}try {String url;//获取文件的md5,通过对比文件md5,防止上传相同内容的文件String md5 = DigestUtils.md5DigestAsHex(file.getInputStream());//通过MD5来查询文件Files dbFiles = this.getFileByMD5(md5);if (dbFiles != null) {//如果数据库存在相同文件,直接获取urlurl = dbFiles.getUrl();} else {//如果数据库不存在相同文件,先存储到本地磁盘,再设置文件urlfile.transferTo(uploadFile);//把获取到的文件存储带磁盘目录url = "http://localhost:8800/files/" + fileUuid;//设置文件url}//将文件存储到数据库Files saveFile = new Files();saveFile.setFilesName(originalFilename);saveFile.setType(type);saveFile.setSize(size / 1024);//(单位:KB)saveFile.setUrl(url);saveFile.setMd5(md5);//保存操作save(saveFile);//返回文件下载路径urlreturn url;} catch (IOException e) {e.printStackTrace();return null;}}//将文件以流的形式一次性读取到内存,通过响应输出流输出到前端@Overridepublic void download(String filesUUID, HttpServletResponse response) {try {//根据文件的唯一标识码获取文件File uploadFile = new File(filesUploadPath + filesUUID);//读取文件的字节流FileInputStream fileInputStream = new FileInputStream(uploadFile);//将文件写入输入流InputStream inputStream = new BufferedInputStream(fileInputStream);byte[] buffer = new byte[inputStream.available()];inputStream.read(buffer);inputStream.close();//attachment表示以附件方式下载 inline表示在线打开 "Content-Disposition: inline; filename=文件名.png"//filename表示文件的默认名称,因为网络传输只支持URL编码的相关支付,因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filesUUID, "UTF-8"));response.setContentType("application/octet-stream");//设置输出流的格式ServletOutputStream os = response.getOutputStream();os.write(buffer);//关闭fileInputStream.close();os.flush();os.close();} catch (IOException e) {e.printStackTrace();}}//通过文件MD5查询文件private Files getFileByMD5(String md5) {//查找数据库是否已经存在一样的图片QueryWrapper<Files> queryWrapper = new QueryWrapper<>();queryWrapper.eq("md5", md5);List<Files> filesList = list(queryWrapper);return filesList.size() == 0 ? null : filesList.get(0);}
}

🚀6 创建控制层和全局统一返回结果类

6.1 创建控制层FilesController

@RestController
@RequestMapping("/files")
public class FilesController {@Autowiredprivate FilesService filesService;@PostMapping("upload")public Result upload(@RequestParam MultipartFile file) {//获取上传文件String url = filesService.upload(file);return Result.ok(url);}@GetMapping("/{filesUUID}")public void download(@PathVariable String filesUUID, HttpServletResponse response) {//下载文件filesService.download(filesUUID, response);}

🚀7 创建全局统一返回结果类

7.1 创建自定义返回类Result

//全局统一返回结果类
@Data
public class Result<T> {//返回码private Integer code;//返回消息private String message;//返回数据private T data;public Result() {}protected static <T> Result<T> build(T data) {Result<T> result = new Result<T>();if (data != null)result.setData(data);return result;}public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {Result<T> result = build(body);result.setCode(resultCodeEnum.getCode());result.setMessage(resultCodeEnum.getMessage());return result;}public static <T> Result<T> build(Integer code, String message) {Result<T> result = build(null);result.setCode(code);result.setMessage(message);return result;}public static <T> Result<T> ok() {return Result.ok(null);}//操作成功public static <T> Result<T> ok(T data) {Result<T> result = build(data);return build(data, ResultCodeEnum.SUCCESS);}public static <T> Result<T> fail() {return Result.fail(null);}//操作失败public static <T> Result<T> fail(T data) {Result<T> result = build(data);return build(data, ResultCodeEnum.FAIL);}public Result<T> message(String msg) {this.setMessage(msg);return this;}public Result<T> code(Integer code) {this.setCode(code);return this;}public boolean isOk() {if (this.getCode().intValue() == ResultCodeEnum.SUCCESS.getCode().intValue()) {return true;}return false;}
}

7.2 创建自定义返回信息枚举类ResultCodeEnum

@Getter
public enum ResultCodeEnum {SUCCESS(200, "成功"),FAIL(201, "失败"),TOKEN_ERROR(400, "HTTP请求失败"),TOKEN_PARSING_FAILED(401, "用户认证失败"),USER_CHECK_ERROR(403, "用户权限不足");private final Integer code;private final String message;ResultCodeEnum(Integer code, String message) {this.code = code;this.message = message;}
}

📋 8 使用Postman测试

8.1 测试上传文件。

  1. 上传成功并返回url。

在这里插入图片描述2. 查看数据库。在这里插入图片描述

8.2 测试下载文件。

  1. 直接将返回的url复制到搜索引擎。

在这里插入图片描述

  1. 文件下载成功。

在这里插入图片描述


🦢9 前端Vue+ElementUI

1 上传

  1. 使用el-upload标签。

    <el-upload action="http://localhost:8800/files/upload":show-file-list="false":on-success="handleUploadSuccess"style="display: inline-block"><el-button type="primary" icon="el-icon-upload" style="margin-right: 10px">上传</el-button>
    </el-upload>
    
  2. 文件上传成功时的钩子handleUploadSuccess。

    methods: {//上传文件按钮handleUploadSuccess(res) {if (res.code === 200) {this.$message.success("上传成功")//this.getList()//刷新页面} else {this.$message.error("上传失败")}},
    }
    

2 下载

  1. 写个按钮el-button。

    <template slot-scope="scope"><el-button type="primary" icon="el-icon-download" @click="download(scope.row.url)">下载</el-button>
    </template>
    
  2. 定义方法download。

    methods: {//下载文件download(row) {file.downloadFiles(row).then(res => {console.log(res)})},
    }
    

📫10 代码仓库

该方法运用到项目中,有问题可以直接查看完整项目。

NSMS | Gitee

在这里插入图片描述


http://chatgpt.dhexx.cn/article/BKK4HHlu.shtml

相关文章

VUE项目中使用node.js搭建server连接本地mysql数据库

最近在研究vue项目中使用node.js搭建server服务器&#xff0c;链接本地mysql数据库&#xff0c;进行数据操作。 准备工作&#xff1a; 1.vue 2.node.js 3:mysql 前面两项对于入行前端的小伙伴应该不是问题了吧&#xff0c; 如果有的话&#xff0c;可以参考vue安装项目。 我选…

vue-实现文件下载

1.利用浏览器的导出功能 window.location.href 服务器文件路径 相当于后端告诉前端文件的地址&#xff0c;直接使用浏览器去下载 2.以流的形式下载文件 查了一些资料&#xff0c;主要用的代码如下&#xff0c;原文章&#xff1a;入口 在此基础上增加了params&#xff0c;…

(基于Vue.js的在线教学平台)源代码+数据库表 Vue.js+Node.js+MySQL 源码免费分享

一.先言 毕业已经快一年啦&#xff0c;工作总时长也一年半左右了啦。现在也毕业季&#xff0c;想着与其吃灰&#xff0c;不如把去年写的毕设可以分享给大家&#xff0c;大家可以做过参考什么的&#xff0c;毕竟社区里秉承分享快乐原则~当然&#xff0c;这个项目其实很简单&…

Vue下载安装步骤的详细教程(亲测有效) 1

目录 一、【准备工作】nodejs下载安装(npm环境) 1 下载安装nodejs 2 查看环境变量是否添加成功 3、验证是否安装成功 4、修改模块下载位置 &#xff08;1&#xff09;查看npm默认存放位置 &#xff08;2&#xff09;在 nodejs 安装目录下&#xff0c;创建 “node_global…

MySQL 免安装版的下载与配置教程

文章目录 前置附录MySQL 常用命令 事先准备下载 MySQL卸载 MySQL安装 MySQL设置 MySQL 开机自启动远程访问 MySQL使用 MySQL Workbench 远程访问 MySQL使用 Navicat Premium 远程访问 MySQL使用 DataGrip 远程访问 MySQL 后置附录MySQL 的配置文件数据库存放目录 笔者的运行环境…

Vue+MySQL+Springboot

文章目录 一、Vue前端1. 去官网下载Nodejs&#xff0c;如果希望稳定的开发环境则下LTS2. 安装好后winr输入node -v查询是否安装成功3. 高版本的nodejs自带npm&#xff0c;则不必再下载&#xff0c;查询命令npm -v4. 由于在国内使用npm是非常慢的&#xff0c;所以在这里我们推荐…

Vue.js下载与安装

windows系统 1. 特点 Vue.js&#xff1a;是一套构建用户界面的渐进式框架 Vue&#xff1a;只关注视图层&#xff0c;采用自底向上增量开发的设计 Vue&#xff1a;目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件 2. Vue.js的下载与安装 1&#xff09;下载安装No…

MySQL的下载、配置(手把手)

一、MySQL下载 首先到官网下载MySQL,下载链接&#xff1a;https://downloads.mysql.com/archives/community/ 进入到页面&#xff1a; 选择你需要使用的MySQL版本&#xff08;我这里选择5.7.24&#xff0c;比较稳定的版本&#xff09;选择你的操作系统&#xff08;windows&a…

vue+nodejs+mysql上线部署(服务器CentOS8)

一.Liunx配置安装node(环境配置&#xff09; 建software文件夹 mkdir /opt/software 2.进入software文件夹 cd /opt/software 3.查看服务器系统&#xff0c;下载相应的node版本 uname -a 去nodejs 官网&#xff0c;找nodejs linux的下载链接 (推荐下载node-v16.5.0版本&#x…

[记录六]Vue+node+koa2+mysql+nginx+redis,全栈开发小程序和管理员管理系统项目——服务端图片上传与下载

大家好&#xff0c;我是小佑小佐&#xff1a;https://blog.csdn.net/Smell_rookie&#xff0c;是一名页面仔工程师&#xff0c;我会不定时在CSDN更新我的博客&#xff0c;有兴趣的可以点个关注来逛逛我的主页。 前言&#xff1a;本项目需要涉及前端上传图片与显示图片&#xff…

Vue.js 最新官方下载地址与项目导入

目录 VUE2下载网址 VUE2使用示例&#xff1a; VUE3下载与使用 VUE3示例&#xff1a; 在官网上下载vue.js或者是vue.min.js。并用<script>标签引入。 应小伙伴要求区分一下版本&#xff1a; VUE2下载网址 Installation — Vue.jsVue.js - The Progressive JavaScrip…

vue.js下载及安装的三种方法

vue.js下载及安装的三种方法 要下载安装vue首先得下载安装node.js和npm。下载安装好这两样以后就可以安装vue了&#xff0c;下面给大家介绍三种安装vue的方法。 1.直接在官网上下载 在官网上下载vue.js。并用<script>标签引入。 注意&#xff1a;下载时网址是 https://vu…

vue下载

第一步&#xff1a; 安装 node.js &#xff08;如果已安装就不用装了&#xff0c;当然如果你想安装最新版本的node.js最好是从新安装一遍&#xff09; node.js安装官网地址 https://nodejs.org/zh-cn/ 安装完成之后 winr 键 打开运行 输入cmd 打开命令行窗口 输入 node -v …

vue+node.js+express+axios实现连接mysql数据库(前后端分离,详细版)

这两个星期都在学vue技术&#xff0c;感觉真的是博大精深啊&#xff01; 今天&#xff0c;我给大家总结了用axios连接数据库的步骤&#xff0c;让大家少走弯路&#xff08;不像我&#xff0c;我用axios连了两天才连接成功。。。&#xff09; 1、首先&#xff0c;确保你已经有了…

VUE下载及安装

下载node.js node.js下载 &#xff0c;选择长期维护版安装NODE&#xff0c;直接全部默认&#xff0c;不要安装在C盘设置NODE 在nodejs安装路径下&#xff0c;新建node_global和node_cache两个文件夹&#xff0c;这是npm安装的全局模块所在的路径&#xff0c;以及缓存cache的路径…

全网最新的vue.js下载和安装的3种方法(2023年)

文章目录 1. 文章引言2. 环境搭建3. 安装vue.js3.1 方法一&#xff1a;官网下载vue.js源代码3.2 方法二&#xff1a;使用npm install创建3.3 方法三&#xff1a;使用bower下载 4. 总结 1. 文章引言 我主要从事java后端开发&#xff0c;但对前端也非常感兴趣&#xff0c;立志成…

Vue连接MySql数据库

一、vue-cli2 全局安装 npm install vue-cli -g 局部安装项目 vue init webpack 项目名称 例如&#xff1a;vue init webpack demo1 二、express-generator 1.全局安装 npm install express-generator -g 2.express --viewejs 项目名称 例如&#xff1a;express --view…

vue+mysql实现前端对接数据库

下载引入相关依赖 1、cnpm install --save mysql 2、cnpm install --save axios 3、cnpm install --save body-parser 4、cnpm install --save express 5、cnpm install --save crypto 在main中引入axios import Axios from axios Vue.prototype.$axios axios 配置连接…

vue下载与安装详细教程

1、安装node&#xff08;网址&#xff1a;https://www.bilibili.com/video/BV1LA411u7dE?t10&#xff09; ①、进入node官网https://nodejs.org/zh-cn/ 点击下载&#xff0c;选择适配的 ②、 双击安装&#xff0c;安装路径随意&#xff0c;勾选第四项&#xff0c;把node添加进…

Vue下载与安装

首先安装node.js环境&#xff1a; node.js安装推荐文章&#xff1a;https://www.cnblogs.com/zhouyu2017/p/6485265.html 基于node.js安装淘宝镜像npm install -g cnpm --registryhttps://registry.npm.taobao.org 安装全局vue-cli脚手架,用于帮助搭建所需的模板框架 在cmd…