IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现 -> 正文阅读

[Java知识库]项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现

基于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 {
    @Autowired
    private UserFileService userFileService;
    @Value("${upload.dir}")
    private String uploadPath;
    /**
     * 返回当前用户的所有文件列表---json格式数据
     */
    @GetMapping("/findAllJSON")
    @ResponseBody
    public List<UserFile> findAllJSON(HttpSession session, Model model) {
        //在登录的session中获取用户的id
        User 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 {
        //获取上传文件用户id
        User 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中获取用户的id
        User 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》

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:07:52  更:2022-07-17 16:12:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:32:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码