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));
相关推荐
Victor3561 小时前
Redis(138) Redis的模块如何开发?
后端
Victor3561 小时前
Redis(139)Redis的Cluster是如何实现的?
后端
晨非辰3 小时前
数据结构排序系列指南:从O(n²)到O(n),计数排序如何实现线性时间复杂度
运维·数据结构·c++·人工智能·后端·深度学习·排序算法
j***12157 小时前
Spring Boot中Tomcat配置
spring boot·tomcat·firefox
z***67777 小时前
SpringBoot(整合MyBatis + MyBatis-Plus + MyBatisX插件使用)
spring boot·tomcat·mybatis
Filotimo_9 小时前
Spring Boot 整合 JdbcTemplate(持久层)
java·spring boot·后端
半桶水专家9 小时前
Go 语言时间处理(time 包)详解
开发语言·后端·golang
编程点滴9 小时前
Go 重试机制终极指南:基于 go-retry 打造可靠容错系统
开发语言·后端·golang
码事漫谈10 小时前
AI编程规模化实践:从1到100的工程化之道
后端