项目_功能模块_基于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》

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值