一张图带你学会入门级别的SpringBoot实现文件上传、下载功能

简介: 一张图带你学会入门级别的SpringBoot实现文件上传、下载功能

思维导图




🌟前言


在开发系统过程中,往往离不开系统文件上传于下载的功能,本篇文章就对SpringBoot实现文件上传与下载功能作出演示。


🌟要点准备


MultipartFile是Spring框架提供的一个接口,用于处理文件上传的请求。它封装了上传的文件内容、文件名、大小等信息,并提供了一些常用的方法来操作文件。下表是常用的API


方法 描述
String getOriginalFilename() 获取上传文件的原始文件名
String getName() 获取文件域的名称
String getContentType() 获取上传文件的内容类型
boolean isEmpty() 判断上传的文件是否为空
long getSize() 获取上传文件的大小,单位为字节
byte[] getBytes() 将上传文件的内容以字节数组形式返回
InputStream getInputStream() 获取上传文件的输入流,可以用于读取文件内容
void transferTo(File dest) 将上传文件保存到指定的目标文件


🌟实现步骤


功能概述:实现文件上传功能并保存到数据库表file中,以及文件下载功能。

实现思路:

  1. 客户端通过发送上传请求到 Spring Boot 服务器,服务器返回一个上传页面供用户选择文件。
  2. 用户选择并上传文件,服务器获取文件信息(文件名称、文件路径、文件大小、文件类型)。
  3. 服务器将文件保存到指定的存储设备中。
  4. 存储设备将文件保存成功后,服务器将文件信息保存到数据库。
  5. 服务器返回上传成功消息给客户端。
  6. 客户端发起下载请求,服务器根据文件ID查询文件信息。
  7. 服务器从数据库中获取文件信息。
  8. 服务器根据文件路径从存储设备中获取文件。
  9. 服务器构建文件资源,并将其返回给客户端。
  10. 客户端请求下载指定文件,服务器根据文件路径从存储设备中获取文件。
  11. 服务器设置响应头信息,并构建响应体返回给客户端。


数据表准备


创建数据库表file

  • id:主键ID
  • file_name:文件名称
  • file_path:文件路径
  • file_type:文件类型
  • file_size:文件大小
CREATE TABLE `file`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `file_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `file_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `file_size` bigint(20) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;


File实体类


创建File实体类,并生成getter和setter方法。这里我做出了省略。

public class File implements Serializable {
    private Integer id;
    private String fileName;
    private String filePath;
    private Integer fileSize;
    private String fileType;
    //省略getter,setter
}


配置文件保存目录


file.upload-path = E:/upload


FileController编写


注意一定要将文件保存到本地路径后,再进行数据库信息的保存!本上传方法较为简单,非常适合入门级别查看。

@RestController
@RequestMapping("/api/v1/file")
public class FileController {
    @Autowired
    private FileService fileService;
    @Value("${file.upload-path}")
    private String uploadPath;
    //上传功能
    @GetMapping("upload")
    public JsonData uploadFile(@RequestParam("file") MultipartFile file) throws IOException {
        //获取文件上传名称
        String fileName=file.getOriginalFilename();
        //获取文件保存全路径
        String savePath=uploadPath+"/"+fileName;
        //获取文件大小
        Long fileSize=file.getSize();
        //获取文件类型
        String fileType=file.getContentType();
        java.io.File newFile=new java.io.File(savePath);
        //TODO 注意要将文件保存到本地路径中
        file.transferTo(newFile);
        File saveFile=new File();
        saveFile.setFileName(fileName);
        saveFile.setFileSize(fileSize);
        saveFile.setFileType(fileType);
        saveFile.setFilePath(savePath);
        fileService.saveFile(saveFile);
        return JsonData.buildSuccess();
    }
}
//文件下载
@GetMapping("down")
    public ResponseEntity downFile(@RequestParam Integer id) throws MalformedURLException, UnsupportedEncodingException {
        //首先根据id,从数据库获取文件信息
        File downFile=fileService.selectFileById(id);
        if (downFile!=null){
            String path= downFile.getFilePath();
            //本地路径地址转为url编码路径
            URI urlPath= Paths.get(path).toUri();
            Resource resource=new UrlResource(urlPath);
            if (resource.exists()){
                HttpHeaders headers=new HttpHeaders();
                headers.add(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_OCTET_STREAM+"");
                headers.add(HttpHeaders.CONTENT_LENGTH,downFile.getFileSize()+"");
                //注意文件名处要改为URL编码
                headers.add(HttpHeaders.CONTENT_DISPOSITION,"attachment; filename=\"" +
                        URLEncoder.encode(downFile.getFileName(),"utf-8") + "\"");
                return ResponseEntity.ok().headers(headers).body(resource);
            }
        }
        return ResponseEntity.notFound().build();
    }


🌟最终测试


文件上传



数据库成功保存并且本地路径也有当前文件


2d1ad4e3df20a26bea5e648ab0029544_5c2cef7d73f94e4d9033c63f3b38b656.png


文件下载



🌟写在最后


有关于SpringBoot实现文件上传、下载功能到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。



目录
相关文章
|
10月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
792 2
|
缓存 前端开发 Java
SpringBoot 实现动态菜单功能完整指南
本文介绍了一个动态菜单系统的实现方案,涵盖数据库设计、SpringBoot后端实现、Vue前端展示及权限控制等内容,适用于中后台系统的权限管理。
1236 1
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
1726 8
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
2733 0
|
前端开发 JavaScript Java
SpringBoot实现国际化i18n功能
SpringBoot实现国际化i18n功能
1459 0
SpringBoot实现国际化i18n功能
|
10月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
10月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
10月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。