SpringBoot实现文件上传下载功能

简介: 本文介绍了如何使用SpringBoot实现文件上传与下载功能,涵盖配置和代码实现。包括Maven依赖配置(如`spring-boot-starter-web`和`spring-boot-starter-thymeleaf`)、前端HTML页面设计、WebConfig路径映射配置、YAML文件路径设置,以及核心的文件上传(通过`MultipartFile`处理)和下载(利用`ResponseEntity`返回文件流)功能的Java代码实现。文章由Colorful_WP撰写,内容详实,适合开发者学习参考。

SpringBoot实现文件上传下载功能

配置和前端页面

  • maven配置文件

xml

代码解读

复制代码

    <dependencies>
        <!--  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>
    </dependencies>
  • 前端页面

html

代码解读

复制代码

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.5.0/jquery.js"></script>
</head>
<body>
<h3>文件上传</h3>
<!--文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data"-->
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" >
    <br>
    <input type="submit" value="上传" >
</form>

[[${filename}]]

<br>
<!--渲染上传的图片-->
<img th:src="@{${filename}}" alt="图片" id="imgss">
<h3>文件下载</h3>
<form action="/download" method="get">
    <input type="hidden" name="imageName" id="imageName" th:value="${filename}"/>
    <input type = "submit"  value="点击图片下载" >
</form>
</body>
</html>
  • webconfig配置

java

代码解读

复制代码

@Configuration
public class MyWebAppConfigurer implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        
        //  用于前端匹配路径 /AAA-uploaded/** 的时候 可以直接定位到D://AAA-uploaded/图片存储的地址
        //  用于前端页面渲染图片
        registry.addResourceHandler("/AAA-uploaded/**").
                addResourceLocations("file:/" + "D://AAA-uploaded/");
    }
}
  • yaml配置文件

yaml

代码解读

复制代码

server:
  port: 8080

my-config:
  file-path: D:\

文件上传功能

MultipartFile接收前端传来的文件

java

代码解读

复制代码

@Value("${my-config.file-path}")
    private String myFilePath;

    @RequestMapping("upload")
    public String upload(@RequestParam("file") MultipartFile file, Model model) {
        try {
            //  避免图片名字重复 采用时间戳+图片名
            String fileName = System.currentTimeMillis() + file.getOriginalFilename();
            //  获取图片存放路径
            String destFileName = myFilePath + "AAA-uploaded" + File.separator + fileName;
            File destFile = new File(destFileName);
            //  判断上一级目录是否存在 不存在则创建
            if (!destFile.getParentFile().exists()) {
                destFile.getParentFile().mkdirs();
            }
            //  移动文件到指定目录下
            file.transferTo(destFile);
            //  存放到页面用于回显测试
            model.addAttribute("filename", "AAA-uploaded/" + fileName);
        } catch (Exception e) {
            e.printStackTrace();
            return "上传失败," + e.getMessage();
        }
        return "index";
    }

文件下载功能

ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文

java

代码解读

复制代码

@Value("${my-config.file-path}")
    private String myFilePath;
@ResponseBody
    @RequestMapping("/download")
    public ResponseEntity<byte[]> testResponseEntity(@RequestParam(value = "imageName", required = false) String 	filename) throws IOException {
        //  获取图片名称返回给页面用于下载
        String name = filename.split("/")[1];
        File newfile = new File("D:/AAA-uploaded" + File.separator + name);
        if (!newfile.exists()) {
            throw new IOException(name + "文件不存在");
        }
        //  创建输入流
        InputStream is = new FileInputStream(newfile);
        //  创建字节数组
        byte[] bytes = new byte[is.available()];
        //  将流读到字节数组中
        is.read(bytes);
        //  创建HttpHeaders对象设置响应头信息
        MultiValueMap<String, String> headers = new HttpHeaders();
        //  设置要下载方式以及下载文件的名字
        headers.add("Content-Disposition", "attachment;filename="+ name);
        //  设置响应状态码
        HttpStatus statusCode = HttpStatus.OK;
        //  创建ResponseEntity对象
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);
        //  关闭输入流
        is.close();
        return responseEntity;
    }


转载来源:https://juejin.cn/post/7173261648038379551

相关文章
|
4月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
554 2
|
7月前
|
缓存 前端开发 Java
SpringBoot 实现动态菜单功能完整指南
本文介绍了一个动态菜单系统的实现方案,涵盖数据库设计、SpringBoot后端实现、Vue前端展示及权限控制等内容,适用于中后台系统的权限管理。
752 1
|
9月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
1173 8
|
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)。
1677 0
|
前端开发 JavaScript Java
SpringBoot实现国际化i18n功能
SpringBoot实现国际化i18n功能
1330 0
SpringBoot实现国际化i18n功能
|
4月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
4月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
4月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。