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

相关推荐
安之若素^4 分钟前
启用不安全的HTTP方法
java·开发语言
ruanjiananquan9910 分钟前
c,c++语言的栈内存、堆内存及任意读写内存
java·c语言·c++
chuanauc37 分钟前
Kubernets K8s 学习
java·学习·kubernetes
一头生产的驴1 小时前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
YuTaoShao1 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
zzywxc7871 小时前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
YuTaoShao3 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张33 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
llwszx6 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
云泽野7 小时前
【Java|集合类】list遍历的6种方式
java·python·list