当前位置: 首页 > article >正文

SpringBoot实现zip压缩包下载

目录

前言

后端(Spring Boot)

前端(HTML + JavaScript)


前言

        下面是一个简单的 Java Spring Boot 实现下载 ZIP 压缩包的示例,包含前端和后端代码。

后端(Spring Boot)

  1. 创建 Spring Boot 项目 使用 Spring Initializr 创建一个新的 Spring Boot 项目,选择 Web 和 Lombok 依赖。

  2. Controller 实现

创建一个控制器,处理 ZIP 文件的生成和下载请求:

import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

@RestController
public class FileDownloadController {

    @GetMapping("/download/zip")
    public ResponseEntity<ByteArrayResource> downloadZip() {
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
             ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream)) {

            // 添加文件到 ZIP
            addToZip(zipOutputStream, "file1.txt", "This is the content of file1.");
            addToZip(zipOutputStream, "file2.txt", "This is the content of file2.");

            zipOutputStream.finish();

            ByteArrayResource resource = new ByteArrayResource(byteArrayOutputStream.toByteArray());
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=files.zip")
                    .contentType(MediaType.APPLICATION_OCTET_STREAM)
                    .body(resource);
        } catch (IOException e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
    }

    private void addToZip(ZipOutputStream zipOutputStream, String fileName, String content) throws IOException {
        ZipEntry zipEntry = new ZipEntry(fileName);
        zipOutputStream.putNextEntry(zipEntry);
        zipOutputStream.write(content.getBytes());
        zipOutputStream.closeEntry();
    }
}

解释:

  • 创建一个 /download/zip 路径的 GET 请求处理方法。
  • 使用 ByteArrayOutputStream 和 ZipOutputStream 生成 ZIP 文件。
  • 使用 ZipEntry 添加文件内容到 ZIP 中。
  • 返回 ByteArrayResource 作为响应体,并设置适当的响应头。
  • application.properties 确保在 src/main/resources/application.properties 中配置了必要的设置(如服务器端口等)。

前端(HTML + JavaScript)

在前端,你可以使用简单的 HTML 和 JavaScript 来触发下载:

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Download ZIP</title>
</head>
<body>
    <h1>Download ZIP Example</h1>
    <button id="downloadBtn">Download ZIP</button>

    <script>
        document.getElementById('downloadBtn').addEventListener('click', function () {
            fetch('/download/zip')
                .then(response => {
                    if (response.ok) {
                        return response.blob(); // 获取 Blob 数据
                    }
                    throw new Error('Network response was not ok.');
                })
                .then(blob => {
                    const url = window.URL.createObjectURL(blob);
                    const a = document.createElement('a');
                    a.style.display = 'none';
                    a.href = url;
                    a.download = 'files.zip'; // 指定下载的文件名
                    document.body.appendChild(a);
                    a.click(); // 模拟点击下载
                    window.URL.revokeObjectURL(url); // 释放 URL 对象
                })
                .catch(error => console.error('There was a problem with the fetch operation:', error));
        });
    </script>
</body>
</html>

解释:

  • 创建一个按钮来触发下载。
  • 使用 fetch API 请求后端的 /download/zip 接口。
  • 如果请求成功,获取 Blob 数据并创建一个临时链接来下载 ZIP 文件。

测试

  1. 启动 Spring Boot 应用。
  2. 在浏览器中打开 HTML 文件,点击“Download ZIP”按钮。
  3. 浏览器将下载生成的 ZIP 文件。

这样,你就实现了一个简单的前后端分离的 ZIP 文件下载功能!


http://www.kler.cn/a/375263.html

相关文章:

  • 电脑丢失bcrypt.dll文件是什么原因?找不到bcrypt.dll文件修复办法来啦!
  • Leetcode 3393. Count Paths With the Given XOR Value
  • “AI 线索精益模型调用系统:开启精准营销新引擎
  • 汽车IVI中控开发入门及进阶(46):FFmpeg
  • 高级的SQL查询技巧有哪些?
  • GOC编程 第2课 简单命令---直走和转弯命令
  • sprintf函数使用指南
  • 0.STM32F1移植到F0的各种经验总结
  • html中cookie如何存储
  • ChatGPT-o1在辅助论文参考文献写作中的表现如何?有哪些提升?
  • 整车功能架构 --- 智能座舱
  • 红日安全-ATT CK实战:Vulnstack靶场实战
  • 深度学习之降维和聚类
  • 【数据库系统概论】第3章 关系数据库标准语言SQL(一)数据查询(超详细)
  • 中仕公考:25年上海省考时间
  • PyTorch实践-CNN-手写数字识别
  • 大数据新视界 -- 大数据大厂之数据质量管理全景洞察:从荆棘挑战到辉煌策略与前沿曙光
  • Docker打包自己项目推到Docker hub仓库(windows10)
  • 软件测试基础知识最强总结(2024版)
  • 如何找到网上爆款内容,快速复制扩大品牌声量
  • 因为Flock,Flutter又凉一次
  • Node.js——初识Node.js
  • 代码随想录算法训练营第三十二天 | 动态规划理论基础 509.斐波那契数 70.爬楼梯 746.使用最小花费爬楼梯
  • 高效管理与自动化:Python在云服务中的应用
  • 【Python】把所有安装包都更新的方法(解决ImportError中版本不兼容的问题)
  • springboot项目中引入配置文件数据的方式