springboot文件上传下载实战

  • 创建项目
    • pom.xml
  • 数据库建表与环境准备
    • 建表SQL
    • 配置文件 application.properties
    • 整体架构
  • 前端页面
    • 登录页面 login.html
    • 文件列表页面 showAll.html
  • 页面跳转控制器
  • 登录功能
    • 登录功能测试
  • 展示所有文件
    • 展示所有文件功能测试

GitHub:https://github.com/szluyu99/springboot_files

后续内容:springboot文件上传下载实战 ——文件上传、下载、在线打开、删除

SpringBoot 知识点目录: SpringBoot 核心知识点整理!

创建项目

通过 Spring Initializr 或者 直接创建一个 Maven 项目来构建一个 springboot 项目,我们通过 Spring Initializr 来创建:

输入项目信息:

选择 Sprig Wbe 依赖,其他依赖可以看我后面的 pom.xml。

删除一些用不到的文件和文件夹(比如 test 下的文件),基础的 spring boot 项目结构如下:

pom.xml

这些是本项目中要用到依赖,直接复制我的 pom.xml 即可。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><!--继承springboot父项目--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.7.RELEASE</version></parent><groupId>com.yusael</groupId><artifactId>myfiles</artifactId><version>0.0.1-SNAPSHOT</version><name>myfiles</name><description>文件的上传与下载实战</description><properties><java.version>1.8</java.version></properties><dependencies><!--引入springboot的web支持--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--thymeleaf--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.2</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.43</version><scope>runtime</scope></dependency><!--druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.12</version></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!--commons--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><!--热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

数据库建表与环境准备

需求分析:

  • 要做的是文件管理系统,自然要存储文件的信息,需要文件信息表(t_files)
  • 我们要做用户的登录功能,需要用户表(t_user)(此处为了简略,省略注册,若想看注册,可以看 基于springboot+thymeleaf+mybatis的员工管理系统 —— 登录与注册)

建表SQL

用户表 t_user 的 SQL:

CREATE TABLE `t_user` (`id` int(8) NOT NULL,`username` varchar(80) DEFAULT NULL,`password` varchar(80) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

文件信息表 t_files 的 SQL:

CREATE TABLE `t_files` (`id` int(8) NOT NULL AUTO_INCREMENT,`oldFileName` varchar(200) DEFAULT NULL,`newFileName` varchar(300) DEFAULT NULL,`ext` varchar(20) DEFAULT NULL,`path` varchar(300) DEFAULT NULL,`size` varchar(200) DEFAULT NULL,`type` varchar(120) DEFAULT NULL,`isImg` varchar(8) DEFAULT NULL,`downcounts` int(6) DEFAULT NULL,`uploadTime` datetime DEFAULT NULL,`userId` int(8) DEFAULT NULL,PRIMARY KEY (`id`),KEY `userId` (`userId`),CONSTRAINT `userId` FOREIGN KEY (`userId`) REFERENCES `t_user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;

数据库建完表以后,还需要在 application.properties 中配置。

配置文件 application.properties

spring.application.name=files
server.port=8989
server.servlet.context-path=/files##配置thymleaf(下面注释的是默认配置, 可以不设置)
#spring.thymeleaf.prefix=classpath:/templates/
#spring.thymeleaf.suffix=.html
#spring.thymeleaf.encoding=UTF-8
#spring.thymeleaf.servlet.content-type=text/html
#本项目使用了热部署, 想让热部署生效必须配置这个
spring.thymeleaf.cache=false
#默认无法直接访问templates下的页面, 需要设置
spring.resources.static-locations=classpath:/templates/, classpath:/static/##mysql配置
#指定连接池类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#指定驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#指定url
spring.datasource.url=jdbc:mysql://localhost:3306/userfiles?characterEncoding=UTF-8
#指定用户名
spring.datasource.username=root
#指定密码
spring.datasource.password=1234#指定mapper配置文件位置
mybatis.mapper-locations=classpath:/com/yusael/mapper/*.xml
#指定起别名了的类
mybatis.type-aliases-package=com.yusael.entity#允许最大上传大小
spring.servlet.multipart.max-file-size=500MB
spring.servlet.multipart.max-request-size=500MB##日志配置
logging.level.root=info
logging.level.com.yusael.dao=debug

整体架构

搭建出项目的整体架构如下,然后可以开始进行开发各个功能了。

在启动类中加上 @MapperScan("com.yusael.dao") 来扫描 com.yusae.dao 包。

@SpringBootApplication
@MapperScan("com.yusael.dao")
public class MyfilesApplication {public static void main(String[] args) {SpringApplication.run(MyfilesApplication.class, args);}}

前端页面

这次的实战主要是为了熟悉文件上传与下载,因此页面十分简易。

登录页面 login.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>用户登录</title>
</head>
<body>
<h1>欢迎访问用户文件管理系统</h1>
<form th:action="@{/user/login}" method="post">username: <input type="text" name="username"/> <br>password: <input type="password" name="password"/> <br><input type="submit" value="登录">
</form>
</body>
</html>

文件列表页面 showAll.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>用户文件列表页面</title>
</head>
<body><h1>欢迎: <span th:if="${session.user != null}" th:text="%{session.user.username}"/></h1>
<h2>文件列表</h2>
<table border="1px"><tr><th>ID</th><th>文件原始名称</th><th>文件的新名称</th><th>文件后缀</th><th>存储路径</th><th>文件大小</th><th>类型</th><th>是否图片</th><th>下载次数</th><th>上传时间</th><th>操作</th></tr><tr th:each="file : ${files}"><td><span th:text="${file.id}"/></td><td><span th:text="${file.id}"/></td><td><span th:text="${file.oldFileName}"/></td><td><span th:text="${file.newFileName}"/></td><td><span th:text="${file.ext}"/></td><td><span th:text="${file.path}"/></td><td><span th:text="${file.size}"/></td><td><span th:text="${file.type}"/></td><td><span th:text="${file.isImg}"/><img th:if="${file.isImg}=='是'" style="height: 40px;height: 100px" th:src="${#servletContext.contextPath} + ${file.path} + '/' + ${file.newFileName}" alt=""></td><td th:id="${file.id}"><span th:text="${file.downcounts}"/></td><td><span th:text="${#dates.format(file.uploadTime, 'yyyy-MM-dd hh:mm:ss')}"/></td><td><a th:href="@{/file/download(id=${file.id})}">下载</a><a th:href="@{/file/download(id=${file.id},openStyle='inline')}">在线打开</a><a th:href="@{/file/delete(id=${file.id})}">删除</a></td></tr>
</table>
<hr>
<h3>上传列表</h3>
<form th:action="@{/file/upload}" method="post" enctype="multipart/form-data"><input type="file" name="aaa"><input type="submit" value="上传文件">
</form>
</body>
</html>

页面跳转控制器

com.yusael.controller 包下创建 IndexController.java

package com.yusael.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class IndexController {@GetMapping("/index")public String index() {return "login";}
}

登录功能

com.yusael.entity 包下创建数据库映射的实体类 User.java

package com.yusael.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {private Integer id;private String username;private String password;
}

com.yusael.dao 包下创建 UserDAO.java

package com.yusael.dao;import com.yusael.entity.User;
import org.apache.ibatis.annotations.Param;public interface UserDAO {User login(@Param("username") String username, @Param("password") String password);
}

resources/com/yusael/mapper 目录下创建接口 UserDAOMapper.xml

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yusael.dao.UserDAO"><!--登录--><select id="login" resultType="User">select id, username, password from t_userwhere username = #{username} and password = #{password}</select></mapper>

com.yusael.service 包下创建接口 UserService.java

package com.yusael.service;import com.yusael.entity.User;public interface UserService {User login(String username, String password);
}

com.yusael.service 包下创建接口的实现类 UserServiceImpl.java

package com.yusael.service;import com.yusael.dao.UserDAO;
import com.yusael.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;@Service
@Transactional
public class UserServiceImpl implements UserService {@Autowiredprivate UserDAO userDAO;@Overridepublic User login(String username, String password) {return userDAO.login(username, password);}
}

com.yusael.dao 包下创建 UserController.java

package com.yusael.controller;import com.yusael.entity.User;
import com.yusael.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpSession;@Controller
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/login")public String login(String username, String password, HttpSession session) {User login = userService.login(username, password);if (login != null) {session.setAttribute("user", login); // 用户存在System.out.println("登录成功!");return "redirect:/file/showAll";} else {return "redirect:/index"; // 没有该用户, 跳转回登录界面}}
}

登录功能测试

在数据库的 t_user 表中存储一条数据:

浏览器输入网址:http://localhost:8989/files/index,来到登陆界面,利用数据库中的数据进行登录。

由于我们还没有开发好下面的页面,显示这个是正常的。

我们也可以在 UserController.java 中增加一个输出语句来确保正确登录。

展示所有文件

com.yusael.entity 包下创建数据库映射的实体类 UserFilejava

package com.yusael.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;import java.util.Date;@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Accessors(chain = true)
public class UserFile {private Integer id;private String oldFileName;private String newFileName;private String ext;private String path;private String size;private String type;private String isImg;private Integer downcounts;private Date uploadTime;private Integer userId; // 用户外键
}

com.yusael.dao 包下创建 UserFileDAO

package com.yusael.dao;import com.yusael.entity.UserFile;
import java.util.List;public interface UserFileDAO {// 根据登录用户id获取用户的文件目录List<UserFile> findByUserId(Integer id);
}

com/yusael/mapper 目录下创建 UserFileDAOMapper.xml

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yusael.dao.UserFileDAO"><!--根据用户id查询文件信息--><select id="findByUserId" parameterType="Integer" resultType="UserFile">select id,oldFileName,newFileName,ext,path,size,type,isImg,downcounts,uploadTime,userIdfrom t_fileswhere userId = #{id}</select>
</mapper>

com.yusael.service 包下创建 UserFileService.java

package com.yusael.service;import com.yusael.entity.User;public interface UserService {User login(String username, String password);
}

com.yusael.service 包下创建 UserFileServiceImpl.java

package com.yusael.service;import com.yusael.dao.UserFileDAO;
import com.yusael.entity.User;
import com.yusael.entity.UserFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Service
@Transactional
public class UserFileServiceImpl implements UserFileService{@Autowiredprivate UserFileDAO userFileDAO;@Overridepublic List<UserFile> findById(Integer id) {return userFileDAO.findByUserId(id);}
}

com.yusael.controller 包下创建 UserFileController.java

package com.yusael.controller;import com.yusael.entity.User;
import com.yusael.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpSession;@Controller
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/login")public String login(String username, String password, HttpSession session) {User login = userService.login(username, password);if (login != null) {session.setAttribute("user", login); // 用户存在, 跳转到展示所有文件页面System.out.println("登录成功!");System.out.println(login);return "redirect:/file/showAll";} else {return "redirect:/index"; // 没有该用户, 跳转回登录界面}}
}

展示所有文件功能测试

http://localhost:8989/files/index 网址,输入用户名与密码,点击登录,此时会跳转到展示所有文件页面。

但是由于目前数据库中没有数据,所以什么都不显示。

接下来就要开始做文件上传功能了。

可以看这个:springboot文件上传下载实战 ——文件上传、下载、在线打开、删除

springboot文件上传下载实战 —— 登录功能、展示所有文件相关推荐

  1. springboot文件上传下载实战 ——文件上传、下载、在线打开、删除

    springboot文件上传下载实战 文件上传 文件上传核心 UserFileController 文件上传测试 文件下载与在线打开 文件下载.在线打开核心 UserFileController 文件 ...

  2. FastDFS实现文件上传下载实战

    正好,淘淘商城讲这一块的时候,我又想起来当时老徐让我写过一个关于实现FastDFS实现文件上传下载的使用文档,当时结合我们的ITOO的视频系统和毕业论文系统,整理了一下,有根据网上查到的知识,总结了一 ...

  3. minio实现文件上传下载和删除功能

    前言 之前用到文件上传功能,在这里做个学习记录.使用minio实现,后面会记录使用fastdfs和阿里云的oss实现文件上传以及他们的比较(oss根据流量收费).minio的中文文档:https:// ...

  4. 百度云和阿里云实现文件上传下载和删除功能

    百度云和阿里云类似,本文以百度云为例. 创建百度云对象存储实例 1. 进入百度云官网找到对象存储BOS 2.创建Bucket 3.客户端认证信息 accessKeyId和accessKeySecret ...

  5. 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现

    文章目录 基于Spring Boot的文件上传下载功能模块的设计与实现 1.前言 2.技术栈 3.关键源码 4.实现效果 4.1.登录 4.2.文件列表 4.3.上传文件测试 4.3.1.测试图片 4 ...

  6. 文件上传 java web_JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

  7. 通过ajaxFileUpload异步请求上传文件(ajaxFileUpload+servlet实现文件上传下载)

    1.最终效果 实现选择图片(此处以图片为例,支持所有类型文件的上传),选择之后将选择的图片在页面中显示出来,点击上传,可以将文件上传到指定的地址中,上传成功后在当前页面自动显示下载标签. 源码下载地址 ...

  8. springboot:实现文件上传下载实时进度条功能【附带源码】

    0. 引言 记得刚入行的时候,做了一个文件上传的功能,因为上传时间较久,为了用户友好性,想要添加一个实时进度条,显示进度.奈何当时技术有限,查了许久也没用找到解决方案,最后不了了之. 近来偶然想到这个 ...

  9. SpringMVC Web实现文件上传下载功能实例解析

    需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制. PC端全平台支持,要求支持Window ...

最新文章

  1. AI 算法给手画线稿自动上色指南来了
  2. 50. Pow(x, n) (MATH)
  3. 2021爱分析·时尚品牌数字化厂商全景报告
  4. STM8L HALT与IWDG同时使用问题
  5. 【ParaView教程】第四章 常见问题 —— 在ParaView中怎样对一组数据做处理?
  6. 戴尔t420服务器重装系统教程,教你联想t420系统重装步骤
  7. java生成短网址_http 长网址、短网址(短网址生成API)
  8. DataWindow的数据更新技术及应用
  9. java 倒计时_Java倒计时实现的三种简单方式
  10. 《西部世界》后续,研究人类学能让AI拥有灵魂?
  11. 【虚幻4】连接数据库有感
  12. L2-027. 名人堂与代金券
  13. 数据库课程设计----学生信息与选课、成绩评价管理系统
  14. BCD码优先编码设计
  15. MacBook Pro USB口可以识别U盘却不能识别手机?
  16. 从新手运气到幸存者偏差
  17. 计算机视觉(CV)领域的公司
  18. 什么鬼,Kubelet 重启之后容器也跟着重启了?
  19. 客户文章|南方医科大学李克玄团队破解肠道宏病毒与心肌病关系
  20. 嵌入式工程师修炼:自信 坚强 积极 勤快

热门文章

  1. 大家一般用什么工具测试HTTP和json接口?
  2. 引介 | RLP 编码和解码
  3. LaTex ——P3 中文处理办法
  4. P4 2019年人体姿态估计指引
  5. 最小路径问题_BFS
  6. java中#{}和${}的区别
  7. Linux(1)-CentOS7下解决ifconfig command not found
  8. ie9 jscript7 内存不足 页面无响应
  9. LOJ #6053. 简单的函数
  10. Selenium(Python)页面对象+数据驱动测试框架