当前位置: 首页 > news >正文

vue+srpingboot实现多文件导出

项目场景:

vue+srpingboot实现多文件导出


解决方案:

直接上干货

<el-button type="warning" icon="el-icon-download" size="mini" class="no-margin"  @click="exportSelectedFiles" :disabled="selectedRows.length === 0">导出</el-button>
    async exportSelectedFiles() {if (this.selectedRows.length === 0) {this.$message.warning('请至少选择一条记录');return;}// 提取所有选中的文件的 idconst fileIds = this.selectedRows.map(row => row.id);// 请求文件路径数据const params = { id: fileIds };const fileResponse = await url.getFilePatchData(params);if (fileResponse.data && fileResponse.data.length > 0) {// 提取文件路径const filePaths = fileResponse.data.map(file => file.filepath);this.downloadMultipleFiles(filePaths);} else {this.$message.error('无法获取文件路径');}},

const fileResponse = await url.getFilePatchData(params);这行代码其实就是一个查询接口

选择这条数据将他下面所属的文档路径查询出来 然后调用下载文档的方法
 

// 下载多个文件(打包为ZIP)downloadMultipleFiles(filePaths) {const params = { filePaths: filePaths };url.downloadMultiple(params).then(response => {// 关键修复:确保正确解析二进制流const blob = new Blob([response], { type: 'application/zip' });if (blob.size === 0) {this.$message.error('服务器返回空文件');return;}const downloadUrl = window.URL.createObjectURL(blob);const link = document.createElement('a');link.href = downloadUrl;link.download = `documents_${Date.now()}.zip`;document.body.appendChild(link);link.click();// 延迟清理以避免下载中断setTimeout(() => {document.body.removeChild(link);window.URL.revokeObjectURL(downloadUrl);}, 200);}).catch(error => {this.$message.error('文件下载失败: ' + error.message);});},
url.downloadMultiple(params)也是调用的后端接口跟this.axios=url一样
//多条导出zip@PostMapping("/download-multiple")public void downloadMultipleFiles(@RequestBody Map<String, List<String>> requestBody,HttpServletResponse response) throws IOException {response.setContentType("application/zip");response.setHeader("Content-Disposition", "attachment; filename=documents.zip");response.resetBuffer();try (ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()))) {byte[] buffer = new byte[8192];for (String filePath : requestBody.get("filePaths")) {Path file = Paths.get(filePath).normalize();if (!Files.exists(file) || Files.isDirectory(file)) continue;try (InputStream in = new BufferedInputStream(Files.newInputStream(file))) {ZipEntry entry = new ZipEntry(file.getFileName().toString());zipOut.putNextEntry(entry);int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {zipOut.write(buffer, 0, bytesRead);}zipOut.closeEntry();zipOut.flush();}}}}

调用zip的插件导入对应的依赖即可实现多文件导出,导出会保存生成zip压缩包

http://www.xdnf.cn/news/577441.html

相关文章:

  • Unity中GPU Instancing使用整理
  • Python训练Day30
  • 第3周作业-1层隐藏层的神经网络分类二维数据
  • MQTT报文介绍
  • Linux内存分页管理详解
  • Jsoup解析商品信息具体怎么写?
  • 阿里发布扩散模型Wan VACE,全面支持生图、生视频、图像编辑,适配低显存~
  • FreeCAD傻瓜教程-外螺纹的绘制,利用两个实体进行布尔运算来实现
  • 《P1433 吃奶酪》
  • MCU开发学习记录19* - CAN学习与实践(HAL库) - 定时传输、触发传输和请求传输(轮询与中断实现) -STM32CubeMX
  • Python 代码缩进与结构化编程:从基础到风格规范
  • Robotaxi新消息密集释放,量产元年来临谁在领跑?
  • [Java恶补day2] 49. 字母异位词分组
  • 【SW】从3D模型导出dxf图纸
  • 【算法专题十五】BFS解决最短路问题
  • 04_Prometheus监控docker容器(4)
  • 智慧社区新防线:华奥系AI技术如何让夏季安防“零隐患”
  • 如何在JavaScript中将数值转换为字符串并赋值给数组——以RuoYi-Vue项目为例
  • Redis Cluster动态扩容:架构原理与核心机制解析
  • 航电系统之航点跟踪系统篇
  • C++(27): 标准库 <iterator>
  • 逆向音乐APP:Python爬虫获取音乐榜单 (1)
  • Podman(Pod Manager)简介
  • 嵌入式STM32学习——串口USART 2.1(串口发送字符串和字符)
  • 应用分享 | 软件定义架构如何满足GNSS模拟测试的开放性需求?
  • JDK9~17语法新特性全览:Java语言的持续进化
  • Python数据可视化高级实战之二——热力图绘制探究
  • C++ 输出流格式控制
  • 起重的技术
  • wd软件安装