vue3 多文件下载zip压缩包

vue3多文件下载zip文件包

效果图

在这里插入图片描述

代码块

在这里插入代码片
<template>
  <div>
    <el-button type="primary" @click="downLoadClick">下载文件zip</el-button>
  </div>
</template>

<script setup lang="ts">
import JSZip from "jszip";   // "jszip": "^3.10.1",

const fileUrls = [
  "https://xxxx.aliyuncs.com/erp-test-upload/note/2024/07/14/1/18123873099490877141/消息通知-未读-20240711185838.xlsx",
  "https://xxxx.aliyuncs.com/erp-test-upload/note/2024/07/14/1/1812387309907144404/th.jpg"
];
const zip = new JSZip();

// 下载文件函数
const downLoadClick = async () => {
  try {
    await fileSteam(fileUrls); // 等待所有文件处理完毕
    const blob = await zip.generateAsync({type: 'blob'});
    const url = window.URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = 'files.zip'; // 自定义下载的zip文件名称
    a.click();
    window.URL.revokeObjectURL(url);
  } catch (error) {
    console.error('生成压缩包或下载过程中发生错误:', error);
  }
};

// 文件转文件流且将文件流转成JSZip认可的格式
const fileSteam = async (urls: string[]) => {
  const promises = urls.map(async (url) => {
    try {
      const response = await fetch(url);
      const blob = await response.blob();
      const arrayBuffer = await blob.arrayBuffer();
      const fileName = url.split('/').pop();  // 从 URL 中提取文件名
      zip.file(fileName || 'file', new Uint8Array(arrayBuffer));
    } catch (error) {
      console.error(`Fetch file from ${url} failed:`, error);
    }
  });

  // 等待所有文件都处理完毕
  await Promise.all(promises);
};

</script>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2中,你可以通过创建一个服务器端API来处理文件流的下载并压缩。首先,你需要将压缩后的文件内容作为响应发送给客户端。以下是基本步骤: 1. **后端处理**: - 使用Node.js的`fs`模块读取要压缩的文件。 - 使用`tar`库打包成zip文件,例如`tar-stream`或`archiver`. - 将压缩后的文件转换为`Buffer`或`ReadableStream`,以便可以作为HTTP响应返回。 ```javascript const fs = require('fs'); const tar = require('tar-stream'); // 假设你有文件数组filesToCompress async function createZipArchive(files) { const output = tar.create(); files.forEach(file => { output.append(fs.createReadStream(file.path), { name: file.name }); }); return new Promise((resolve, reject) => { output.finalize(err => { if (err) reject(err); else resolve(output.pipe(zlib.createDeflate())); }); }); } app.post('/download', async (req, res) => { try { const compressedStream = await createZipArchive(yourFiles); // 替换为你要压缩的实际文件列表 res.setHeader('Content-Disposition', 'attachment; filename="archive.zip"'); // 设置下载名称 res.header('Content-Type', 'application/zip'); res.status(200).send(compressedStream); } catch (error) { console.error(error); res.status(500).send({ error: 'Failed to compress the file.' }); } }); ``` 2. **前端请求**: - 在Vue组件中,你可以使用axios或其他http库来发起POST请求,设置 responseType 为 'blob' 或 'arraybuffer',以便接收二进制数据。 ```vue <template> <button @click="downloadArchive">Download</button> </template> <script> import axios from 'axios'; export default { methods: { downloadArchive() { axios.post('/download').then(response => { const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.download = 'archive.zip'; link.click(); window.URL.revokeObjectURL(url); }).catch(error => console.error(error)); }, }, }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值