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 分钟前
Flask应用上下文问题解析与解决方案:从错误日志到完美修复
后端·python·flask
威迪斯特14 分钟前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于Springboot的扶贫众筹平台为例,包含答辩的问题和答案
java·spring boot·后端
lucky67071 小时前
Windows 上彻底卸载 Node.js
windows·node.js
程序员良许1 小时前
三极管推挽输出电路分析
后端·嵌入式
Java水解1 小时前
【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析
后端·spring
编程小白20261 小时前
从 C++ 基础到效率翻倍:Qt 开发环境搭建与Windows 神级快捷键指南
开发语言·c++·windows·qt·学习
Java水解2 小时前
Spring Boot 4 升级指南:告别RestTemplate,拥抱现代HTTP客户端
spring boot·后端
宫水三叶的刷题日记2 小时前
工商银行今年的年终奖。。
后端
大黄评测2 小时前
双库协同,各取所长:.NET Core 中 PostgreSQL 与 SQLite 的优雅融合实战
后端