springboot实现批量下载

后端:

java 复制代码
 public void batchDownload(List<User> list, HttpServletResponse response) {
        if (list==null || list.size()<=0) {
            throw new ServiceException("请选择要下载的文件");
        }
        try {
            // 创建临时压缩文件
            String tempFileName = "批量下载_" + System.currentTimeMillis() + ".zip";
            File tempFile = File.createTempFile("temp_", ".zip");

            try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(tempFile))) {
                for (User user : list) {
                    if (user.getKhcl()!=null) {
                        String filePath = basePath + user.getKhcl().getFilePath();
                        File file = new File(filePath);
                        if (file.exists()) {
                            ZipEntry zipEntry = new ZipEntry(user.getKhcl().getFileName());
                            zipOut.putNextEntry(zipEntry);
                            Files.copy(file.toPath(), zipOut);
                            zipOut.closeEntry();
                        }
                    }
                }
            }

            // 设置响应头
            response.setContentType("application/zip");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(tempFileName, "UTF-8"));

            // 发送文件
            Files.copy(tempFile.toPath(), response.getOutputStream());

            // 删除临时文件
            tempFile.delete();
        } catch (IOException e) {
            System.out.println(Arrays.toString(e.getStackTrace()));
            throw new ServiceException("批量下载失败:"+e.getMessage());
        }

前端:

javascript 复制代码
export function batchDownload(data) {
  return request({
    url: '/system/user/batchDownload',
    method: 'post',
    data: data,
    responseType: 'blob', // 关键:指定响应类型为blob
    headers: {
      'Content-Type': 'application/json'
    }
  })
}

h5:

javascript 复制代码
            // 使用XMLHttpRequest替代$.ajax,以便正确处理二进制数据
            var xhr = new XMLHttpRequest();
            xhr.open('POST', prefix + '/batchDownload', true);
            xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
            xhr.responseType = 'blob';  // 重要:设置响应类型为blob

            xhr.onload = function() {
                $.modal.closeLoading();

                if (xhr.status === 200) {
                    // 从响应头获取文件名
                    var contentDisposition = xhr.getResponseHeader('Content-Disposition');
                    var filename = "批量下载文件.zip";
                    if (contentDisposition) {
                        var filenameMatch = contentDisposition.match(/filename="?(.+)"?/i);
                        if (filenameMatch && filenameMatch.length > 1) {
                            filename = decodeURIComponent(filenameMatch[1]);
                        }
                    }

                    // 创建Blob对象
                    var blob = new Blob([xhr.response], {type: 'application/zip'});

                    // 创建下载链接
                    if (window.navigator && window.navigator.msSaveOrOpenBlob) {
                        // IE浏览器
                        window.navigator.msSaveOrOpenBlob(blob, filename);
                    } else {
                        // 其他浏览器
                        var url = window.URL.createObjectURL(blob);
                        var a = document.createElement('a');
                        a.href = url;
                        a.download = filename;
                        document.body.appendChild(a);
                        a.click();

                        // 清理
                        setTimeout(function() {
                            document.body.removeChild(a);
                            window.URL.revokeObjectURL(url);
                        }, 100);
                    }

                    $.modal.msgSuccess("下载成功");
                } else {
                    // 尝试解析错误消息
                    var reader = new FileReader();
                    reader.onload = function() {
                        try {
                            var errorResponse = JSON.parse(reader.result);
                            $.modal.alertError("下载失败:" + (errorResponse.msg || errorResponse.message || "未知错误"));
                        } catch (e) {
                            $.modal.alertError("下载失败,状态码:" + xhr.status);
                        }
                    };
                    reader.readAsText(xhr.response);
                }
            };

            xhr.onerror = function() {
                $.modal.closeLoading();
                $.modal.alertError("下载请求失败,请检查网络连接");
            };

            xhr.send(JSON.stringify(list));
相关推荐
直奔標竿6 小时前
Java开发者AI转型第二十五课!Spring AI 个人知识库实战(四)——RAG来源追溯落地,拒绝AI幻觉
java·开发语言·人工智能·spring boot·后端·spring
嘟嘟MD6 小时前
程序员副业 | 2026年4月复盘
后端·创业
时空系6 小时前
认识Rust——我的第一个程序 Rust中文编程
开发语言·后端·rust
生而为虫6 小时前
Claude Code 最新版安装教程(Windows/Mac/Linux 全平台) 面向普通用户的 Claude Code 安装与模型接入指南
linux·windows·macos
DevilSeagull7 小时前
Windows 批处理 (Batch) 编程: 从入门到入土. (一) 基础概念与环境配置
开发语言·windows·后端·batch·语言
CAE虚拟与现实7 小时前
五一假期闲来无事,来个前段、后端的说明吧
前端·后端·vtk·three.js·前后端
0xDevNull7 小时前
Java泛型详解
java·开发语言·后端
yeeanna7 小时前
GO函数的特殊性
开发语言·后端·golang
时空系7 小时前
第6篇:数据容器——管理大量数据 Rust中文编程
开发语言·后端·rust
eLIN TECE7 小时前
Go基础之环境搭建
开发语言·后端·golang