如何使用Springboot实现文件上传和下载,并为其添加实时进度条的功能

简介: 如何使用Springboot实现文件上传和下载,并为其添加实时进度条的功能

文件上传和下载是Web开发中非常基础的功能,但在实际开发中,我们经常需要实时显示文件上传或下载的进度。这篇文章将介绍如何使用Springboot实现文件上传和下载,并为其添加实时进度条的功能。

文件上传

添加Maven依赖项

首先,我们需要添加以下Maven依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>

其中,spring-boot-starter-web是Spring Boot提供的用于构建Web应用程序的依赖项之一,commons-fileupload是一个流行的Java文件上传库。

创建HTML表单

接下来,我们需要创建一个HTML表单来提交文件。在这个表单中,我们可以使用元素来选择要上传的文件,并使用元素来提交表单。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Upload</title>
</head>
<body>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file"/>
        <br/>
        <input type="submit" value="Upload"/>
    </form>
</body>
</html>

在这个表单中,我们将表单的action属性设置为"/upload",这是我们将要处理上传请求的URL。

实现文件上传

在Springboot中,可以使用org.springframework.web.multipart.MultipartFile类来处理上传的文件。我们可以编写一个Controller来接收并处理上传的文件:

@RestController
public class UploadController {
   

    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) throws IOException {
   
        // do something with the file
        return "success";
    }
}

在上面的代码中,我们使用@RequestParam注解来指定文件上传的参数名,并将文件保存到磁盘或者进行其他操作。最后,我们返回一个简单的字符串作为响应内容。

添加进度条

为了实现上传进度条功能,我们需要使用JavaScript和Ajax来实现。具体来说,我们可以使用XMLHttpRequest对象来发送异步请求,并在上传过程中实时更新进度条。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Upload</title>
    <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
    <script>
        $(function () {
    
            $("form").submit(function (event) {
    
                event.preventDefault();
                var formData = new FormData($(this)[0]);

                $.ajax({
    
                    xhr: function () {
    
                        var xhr = new window.XMLHttpRequest();
                        xhr.upload.addEventListener("progress", function (evt) {
    
                            if (evt.lengthComputable) {
    
                                var percentComplete = evt.loaded / evt.total;
                                console.log(percentComplete);
                                $("#progress").css("width", percentComplete * 100 + "%");
                            }
                        }, false);
                        xhr.addEventListener("progress", function (evt) {
    
                            if (evt.lengthComputable) {
    
                                var percentComplete = evt.loaded / evt.total;
                                console.log(percentComplete);
                                $("#progress").css("width", percentComplete * 100 + "%");
                            }
                        }, false);
                        return xhr;
                    },
                    type: "POST",
                    url: "/upload",
                    data: formData,
                    processData: false,
                    contentType: false,
                    success: function (data) {
    
                        alert("Upload complete!");
                    }
                });
            });
        });
    </script>
</head>
<body>
<form>
    <input type="file" name="file"/>
    <br/>
    <button type="submit">Upload</button>
</form>
<div style="background-color: #ddd; height: 20px; width: 0%;" id="progress"></div>
</body>
</html>

在上面的代码中,我们使用了jQuery来发送XHR请求,并在上传过程中更新进度条。具体来说,我们为xhr.upload和xhr对象添加了progress事件处理程序,以便在上传文件时实时更新进度条。

文件下载

实现文件下载

要实现文件下载,我们需要编写一个Controller来处理下载请求,并使用org.springframework.core.io.Resource类将文件作为响应内容返回给客户端。

@RestController
public class DownloadController {
   

    @GetMapping("/download")
    public ResponseEntity<Resource> download() throws IOException {
   
        Resource file = new FileSystemResource("/path/to/file");

        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + file.getFilename());

        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(file.contentLength())
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .body(new InputStreamResource(file.getInputStream()));
    }
}

在上面的代码中,我们使用@GetMapping注解来指定处理下载请求的URL,并使用org.springframework.core.io.Resource类来读取文件内容。最后,我们将文件作为响应内容返回给客户端。

添加进度条

添加下载进度条功能与上传进度条类似,我们仍然可以使用XMLHttpRequest对象和JavaScript来实现。具体来说,我们可以向Controller发送一个异步请求,并在下载过程中实时更新进度条。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Download</title>
    <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
    <script>
        $(function () {
    
            $("#download").click(function (event) {
    
                event.preventDefault();

                var xhr = new XMLHttpRequest();
                xhr.open("GET", "/download", true);
                xhr.responseType = "blob";

                xhr.onload = function () {
    
                    if (xhr.status === 200) {
    
                        var contentType = xhr.getResponseHeader("Content-Type");
                        var contentDisposition = xhr.getResponseHeader("Content-Disposition");

                        var blob = new Blob([xhr.response], {
    type: contentType});

                        var link = document.createElement("a");
                        link.href = window.URL.createObjectURL(blob);
                        link.download = contentDisposition.split("=")[1];
                        link.click();
                    }
                };

                xhr.addEventListener("progress", function (evt) {
    
                    if (evt.lengthComputable) {
    
                        var percentComplete = evt.loaded / evt.total;
                        console.log(percentComplete);
                        $("#progress").css("width", percentComplete * 100 + "%");
                    }
                }, false);
                xhr.send();
            });
        });
    </script>
</head>
<body>
<button id="download">Download</button>
<div style="background-color: #ddd; height: 20px; width: 0%;" id="progress"></div>
</body>
</html>

在上面的代码中,我们使用了jQuery来发送XHR请求,并在下载过程中更新进度条。具体来说,我们为xhr对象添加了progress事件处理程序,以便在文件下载时实时更新进度条。

结论

本文介绍了如何使用Springboot实现文件上传和下载,并为其添加实时进度条的功能。在上传和下载文件时,我们使用了XMLHttpRequest对象和JavaScript来实现实时进度条。这个功能可以帮助用户更好地了解文件上传和下载的进度,提升用户体验。

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