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;
      }
      // 提取所有选中的文件的 id
      const 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压缩包

### Vue + Spring Boot 批量打印文件简介 在一个基于Vue.js前端框架和Spring Boot后端服务的应用场景下,实现批量打印文件功能通常涉及以下几个步骤: #### 前端 (Vue) 部分: 1. **收集待打印的数据** 用户通过界面选择需要打印的一个或多个文件,并将它们的信息(例如ID、路径等)传递给后台。 2. **发送请求至服务器** 使用`axios`或其他HTTP客户端库向Spring Boot API发出POST请求,携带所选文件的相关信息作为负载。 3. **处理响应结果并触发浏览器下载** 当收到成功的API响应时,在前端可以采用多种方式让用户保存生成的文档到本地磁盘。比如直接创建a标签模拟点击事件自动启动下载流程;或者利用HTML5提供的FileSaver.js插件简化操作过程。 #### 后端(Spring Boot部分): 4. **接收来自前端发来的数据** 定义RESTful风格的服务接口用于接受来自客户端传入的参数列表。 ```java @PostMapping("/batchPrint") public ResponseEntity<byte[]> batchPrint(@RequestBody List<String> fileIds){ //TODO: 实现业务逻辑... } ``` 5. **组装成适合输出的内容形式** 依据具体的项目需求确定最终导出为什么类型的电子档(PDF, Word等等),然后借助第三方工具包如iText, Apache POI 或 JasperReports 等来构建实际内容。 6. **返回二进制流供用户下载** 一旦完成所有准备工作之后就要设置正确的Http头信息以及体内容,以便于让远端机器能够识别这是可供浏览者存取的目标资源。 以上就是关于如何结合vuespring boot做一批次性的档案列印概述了,当然根据各自项目的具体情况还会有更多细节需要注意调整哦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值