SpringBoot实现zip压缩包下载

目录

前言

[后端(Spring Boot)](#后端(Spring Boot))

[前端(HTML + JavaScript)](#前端(HTML + JavaScript))


前言

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

后端(Spring Boot)

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

  2. Controller 实现

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

java 复制代码
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 请求处理方法。
  • 使用 ByteArrayOutputStreamZipOutputStream 生成 ZIP 文件。
  • 使用 ZipEntry 添加文件内容到 ZIP 中。
  • 返回 ByteArrayResource 作为响应体,并设置适当的响应头。
  • application.properties 确保在 src/main/resources/application.properties 中配置了必要的设置(如服务器端口等)。

前端(HTML + JavaScript)

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

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 文件下载功能!

相关推荐
keyipatience1 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
神奇小汤圆1 小时前
一个接口多个实现,Spring 怎么"适配多场景"?
后端
花开彼岸天~1 小时前
鸿蒙原生开发手记:徒步迹 - 自定义组件开发规范
后端·华为·harmonyos·鸿蒙系统
weixin_408099671 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
钱六两2 小时前
#3、SpringAI 接入deepSeek大模型(喂饭版)
java·spring boot·ai编程
Suhan422 小时前
IDEA 设置启动参数和环境变量
spring boot·spring·编辑器·idea
songroom2 小时前
Kimi K3:Rust封装XTP接口详细教程实践
开发语言·后端·rust
kebeiovo3 小时前
游戏服务端开发:Actor模型详解(Go语言)
开发语言·后端·golang
红烧大青虫3 小时前
setInterval 倒计时实现:60s 验证码发送逻辑
后端·华为·harmonyos·鸿蒙系统
null_173 小时前
IntelliJ IDEA 极致流畅配置方案:Ultra 9 285K + 64GB 内存实测
java·ide·intellij-idea