文章目录

  • 基于Spring Boot的文件上传下载功能模块的设计与实现
    • 1、前言
    • 2、技术栈
    • 3、关键源码
    • 4、实现效果
      • 4.1、登录
    • 4.2、文件列表
    • 4.3、上传文件测试
      • 4.3.1、测试图片
      • 4.3.2、文档
    • 4.4、预览和下载文件测试
      • 4.4.1、图片预览和下载
      • 4.4.2、文档预览和下载
    • 5、源码下载

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

1、前言

2021年的5月份,那时的我大二,受某个学校的老师之托,帮助学校的某个学院做一个系统《创新项目申报管理支持系统》,功能是管理学校的双创项目,能实现项目从申报到结题等等一系列的操作。团队成员一共4个,2个后端+2个前端,我作为项目组长并且负责后端功能的实现,其中有一部分的功能就是文件(PDF、Word、图片……)等资源的上传与下载,当时的我对这些很迷糊,不知道如何去实现,于是就学了一段时间。

整个系统历时9个月,因为都是学生嘛,加上做学校用得系统,不断地调研,分析需求,所以做的比较慢,一直上线测试,然后就调式改BUG,最后系统能基本实现学校的要求,文件上传下载这个模块功能也是很好地实现,我将系统中的文件上传和下载的功能模块抽出来(因为我不知道原系统能否分享,毕竟是帮学校做的),特此分享。

为了更好地演示,搭了个很丑的页面,但是后端只需要关注业务逻辑怎么实现即可,实际开发过程中,会有前端小姐姐去美化界面的,我们要做的就是实现功能即可。

源码下载:下载链接:《基于SpringBoot的文件上传下载功能模块的设计与实现.zip》。

代码中基本都写了很详细的注释。


2、技术栈

Spring Boot+MyBatis+Thymeleaf+JSP

3、关键源码

其实,FileController.java就已经实现了最主要的业务功能了,剩下的就是数据库的增删改查了,我相信那些肯定没什么难度吧啊哈哈哈~

@Controller
@RequestMapping("/file")
public class FileController {@Autowiredprivate UserFileService userFileService;@Value("${upload.dir}")private String uploadPath;/*** 返回当前用户的所有文件列表---json格式数据*/@GetMapping("/findAllJSON")@ResponseBodypublic List<UserFile> findAllJSON(HttpSession session, Model model) {//在登录的session中获取用户的idUser user = (User) session.getAttribute("user");//根据用户id查询有的文件信息List<UserFile> userFiles = userFileService.findByUserId(user.getId());return userFiles;}/*** 删除文件信息*/@GetMapping("/delete")public String delete(String id) throws FileNotFoundException {//根据id查询信息UserFile userFile = userFileService.findById(id);//删除文件String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static" + userFile.getPath();File file = new File(realPath, userFile.getNewFileName());if (file.exists()) {file.delete();//立即删除}//删除数据库中记录userFileService.delete(id);return "redirect:/file/showAll";}/*** 文件下载*/@GetMapping("/download")public void download(String openStyle, String id, HttpServletResponse response) throws IOException {//获取打开方式openStyle = openStyle == null ? "attachment" : openStyle;//获取文件信息UserFile userFile = userFileService.findById(id);//点击下载链接更新下载次数if ("attachment".equals(openStyle)) {userFile.setDowncounts(userFile.getDowncounts() + 1);userFileService.update(userFile);}//根据文件信息中文件名字 和 文件存储路径获取文件输入流String realpath = uploadPath + userFile.getPath();//获取文件输入流FileInputStream is = new FileInputStream(new File(realpath, userFile.getNewFileName()));//附件下载response.setHeader("content-disposition", openStyle + ";fileName=" + URLEncoder.encode(userFile.getOldFileName(), "UTF-8"));//获取响应输出流ServletOutputStream os = response.getOutputStream();//文件拷贝IOUtils.copy(is, os);IOUtils.closeQuietly(is);IOUtils.closeQuietly(os);}/*** 上传文件处理 并保存文件信息到数据库中*/@PostMapping("/upload")public String upload(@RequestParam(value = "uploadFile") MultipartFile uploadFile,HttpSession session) throws IOException {//获取上传文件用户idUser user = (User) session.getAttribute("user");//获取文件原始名称String oldFileName = uploadFile.getOriginalFilename();//获取文件后缀String extension = "." + FilenameUtils.getExtension(uploadFile.getOriginalFilename());//生成新的文件名称String newFileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + UUID.randomUUID().toString().replace("-", "") + extension;//文件大小Long size = uploadFile.getSize();//文件类型String type = uploadFile.getContentType();//处理根据日期生成目录//String realPath = ResourceUtils.getURL("classpath:").getPath() + "/static/files";String dateFormat = new SimpleDateFormat("yyyy-MM-dd").format(new Date());String dateDirPath = uploadPath + "/files/" + dateFormat;File dateDir = new File(dateDirPath);if (!dateDir.exists()) {dateDir.mkdirs();}//处理文件上传uploadFile.transferTo(new File(dateDir, newFileName));//将文件信息放入数据库保存UserFile userFile = new UserFile();userFile.setOldFileName(oldFileName).setNewFileName(newFileName).setExt(extension).setSize(String.valueOf(size)).setType(type).setPath("/files/" + dateFormat).setUserId(user.getId());userFileService.save(userFile);return "redirect:/file/showAll";}/*** 展示所有文件信息*/@GetMapping("/showAll")public String findAll(HttpSession session, Model model) {//在登录的session中获取用户的idUser user = (User) session.getAttribute("user");//根据用户id查询有的文件信息List<UserFile> userFiles = userFileService.findByUserId(user.getId());//存入作用域中model.addAttribute("files", userFiles);return "showAll";}
}

4、实现效果

4.1、登录

根据用户信息来查看用户上传了哪些文件。

4.2、文件列表


4.3、上传文件测试

4.3.1、测试图片

查看文件夹:

查看数据库:

4.3.2、文档

上传:

文件夹:

数据库:


4.4、预览和下载文件测试

点击左侧的操作按钮,选择功能:

4.4.1、图片预览和下载

图片预览:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jWunLgGv-1657444882098)(E:\File\Blog\项目\5_功能实战之文件上传下载\文件上传下载.assets\image-20220710171047486.png)]

图片下载:

4.4.2、文档预览和下载

文档预览:

文档下载:


5、源码下载

可以根据关键源码的FileController.java去理解,其实已经能实现80%的功能了,剩下20%就是数据库操作了,若想直接拿源码,则点击下载即可。

下载链接:《基于SpringBoot的文件上传下载功能模块的设计与实现.zip》。

项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现相关推荐

  1. Mr.张小白(案例:基于Spring MVC实现文件上传和下载)

    基于Spring MVC实现文件上传和下载 一.步骤 1.引入相关依赖pom.xml <?xml version="1.0" encoding="UTF-8&quo ...

  2. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  3. java文件流 m.jb51.net_FasfDFS整合Java实现文件上传下载功能实例详解

    今天使用Java代码实现文件的上传和下载.对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中.或者在Maven项目pom.xml文件中添加依赖 org.c ...

  4. 教你如何实现c#文件上传下载功能

    简单介绍一下c#文件上传下载功能实现. NuGet 安装SqlSugar Model文件下新建 DbContext 类 public class DbContext {public DbContext ...

  5. java实现文件上传下载功能

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

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

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

  7. springboot 上传文件解析入库_十五分钟用Spring Boot实现文件上传功能

    Spring Boot最好的学习方法就是实战训练,今天我们用很短的时间启动我们第一个Spring Boot应用,并且制作一个文件上传系统, 用户可以将本地文件上传到服务器上.我将假设读者为几乎零基础, ...

  8. java图片加水印上传工具类_基于Spring Boot实现图片上传/加水印一把梭操作

    文章共537字,阅读大约需要 2分钟 ! 概述 很多网站的图片为了版权考虑都加有水印,尤其是那些图片类网站.自己正好最近和图片打交道比较多,因此就探索了一番基于 Spring Boot这把利器来实现从 ...

  9. java spring上传图片_基于Spring Boot实现图片上传/加水印一把梭操作

    文章共 537字,阅读大约需要 2分钟 ! 概述 很多网站的图片为了版权考虑都加有水印,尤其是那些图片类网站.自己正好最近和图片打交道比较多,因此就探索了一番基于 Spring Boot这把利器来实现 ...

最新文章

  1. 打开浏览器的包 node_如何发布可在浏览器和Node中使用的软件包
  2. 二进制数代替数组做标记
  3. GDCM:gdcm::PixelFormat的测试程序
  4. MATLAB混合编程视频教程下载 SIMULINK系统仿真视频
  5. 【ES9(2018)】Object Rest Spread
  6. html怎么给变量添加样式,通过CSS变量修改样式
  7. Golang实践录:使用gin框架实现转发功能:利用nginx转发
  8. 用CALayer实现下载进度条
  9. linux脚本下载,linux_脚本编写基础
  10. PMP试题 | 每日一练,快速提分
  11. 芯烨 XP-350b 打印机驱动
  12. java 裁剪 pdf_Java 合并、拆分PDF文档
  13. java线程锁有哪几种_Java锁有哪些种类,以及区别
  14. HDU4622 Reincarnation
  15. Hustoj 添加管理员 删除用户
  16. Matplotlib颜色、线宽、线型、透明度、点型
  17. maven dependency的作用英文解释(转载)
  18. html5播放器的示例代码
  19. 爬虫ua设置及ip代理
  20. 网站是不是php是什么意思,php网站是什么意思?

热门文章

  1. USB转TTL、USB转串口、USB转232的区别(转)
  2. Vscode的相对路径读取问题及处理
  3. 人工智能助力新零售,无人售货柜降至6000元
  4. 2. SQL语句学习
  5. 高版本STM32CubeIDE下载/调试指南
  6. 可解释的机器学习(XML)概览
  7. 手把手教您从建模到仿真计算优化改进新能源汽车电驱动系统转子冲片强度
  8. Kafka系列(五)、开启SASL安全认证以及配置ACL权限控制
  9. Mysql入门技能树-使用数据库
  10. 初中级java开发工程师 -- 面试题库(一)