[vue] jszip html-docx-js file-saver 图片,纯文本 ,打包压缩,下载跨域问题

bash 复制代码
npm install jszip file-saver
js 复制代码
import JSZip from 'jszip';
import FileSaver from 'file-saver';

JSZip

创建JSZip实例:

js 复制代码
const zip = new JSZip();

创建文件:支持导出纯文本

js 复制代码
zip.file("hello.txt", "Hello World\n");

创建文件夹:

js 复制代码
zip.folder("file")

只压缩有地址的文件

// 举个栗子

js 复制代码
const dataList = [
    {
        fileUrl: 'https://www.xxx.com/data/data_service/20210429/144b4b1e4e457485c10fed54b8bc8d48.docx',
        fileName: '文件一'
    },
    {
        fileUrl: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
        fileName: '图片1'
    },
    {
        fileUrl: 'https://......docx',
        fileName: '文件二'
    },
    {
        fileUrl: 'https://......txt',
        fileName: '文件三'
    },
    {
        fileUrl: 'https://......jpg',
        fileName: '文件四'
    },
];
js 复制代码
// 下载全部附件-压缩包
downloadBtn() {
  const blogTitle = '全部附件'; // 下载后压缩包的名称
  const zip = new JSZip();
  const promises = [];

  // 处理 docx/image
  this.dataList.forEach((item) => {
    const promise = this.getBlob(item.fileUrl).then((data) => {
      // 下载文件, 并存成ArrayBuffer对象(blob)
      zip.file(item.fileName, data, { binary: true }); // 逐个添加文件
    });
    promises.push(promise);
  });

  Promise.all(promises).then(() => {
    // 生成二进制流
    zip.generateAsync({ type: 'blob' }).then((blob) => {
      FileSaver.saveAs(blob, blogTitle); // 利用file-saver保存文件  blogTitle:自定义文件名
    });
  }).catch((res) => {
    this.$message.error('文件压缩失败');
  });
},
// 文件以流的形式获取(参数url为文件链接地址)
getBlob(url) {
  return new Promise((resolve) => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'blob';
    xhr.onload = () => {
      if (xhr.status === 200) {
        resolve(xhr.response);
      }
    };
    xhr.send();
  });
},

导出纯文本+图片

先使用html-docx-js库将HTML内容转换为Word文档

bash 复制代码
npm install html-docx-js
js 复制代码
import htmlDocx from 'html-docx-js/dist/html-docx';
js 复制代码
// 下载全部附件-压缩包
downloadBtn() {
  const blogTitle = '全部附件'; // 下载后压缩包的名称
  const zip = new JSZip();
  const promises = [];
  const htmlContent = `<span style="font-family:宋体; font-size:12pt">报告时间</span>`
  // 处理 Html文本
  if (htmlContent ) {
    const name = "11.docx";
    const blob = htmlDocx.asBlob(htmlContent);
    zip.file(name, blob, { binary: true }); // 创建文件
  }

  zip.file("Hello.txt", "Hello World\n"); // 支持纯文本等

   // 处理 docx/image
  this.dataList.forEach((item) => {
    const promise = this.getBlob(item.fileUrl).then((data) => {
      // 下载文件, 并存成ArrayBuffer对象(blob)
      zip.file(item.fileName, data, { binary: true }); // 逐个添加文件
    });
    promises.push(promise);
  });

  Promise.all(promises).then(() => {
    // 生成二进制流
    zip.generateAsync({ type: 'blob' }).then((blob) => {
      FileSaver.saveAs(blob, blogTitle); // 利用file-saver保存文件  blogTitle:自定义文件名
    });
  }).catch((res) => {
    this.$message.error('文件压缩失败');
  });
},

跨域:

点击下载后浏览器会报跨域问题,这个问题并非前端问题,需要后端在存储文件的服务器中设置允许跨域,添加 Access-Control-Allow-Origin 即可!

参考:

JS实现单个或多个文件批量下载的方法详解

前端批量获取文件并打包压缩解决方案

vue中实现文件批量打包压缩下载(以及下载跨域问题分析)

相关推荐
basestone9 小时前
🚀 从重复 CRUD 到工程化封装:我是如何设计 useTableList 统一列表逻辑的
javascript·react.js·ant design
pas1369 小时前
25-mini-vue fragment & Text
前端·javascript·vue.js
软件开发技术深度爱好者9 小时前
JavaScript的p5.js库使用介绍
javascript·html
冴羽9 小时前
CSS 新特性!瀑布流布局的终极解决方案
前端·javascript·css
满天星辰9 小时前
Vue 响应式原理深度解析
前端·vue.js
码途潇潇9 小时前
JavaScript有哪些数据类型?如何判断一个变量的数据类型?
前端·javascript
满天星辰9 小时前
Vue真的是单向数据流?
前端·vue.js
我的写法有点潮10 小时前
JS中对象是怎么运算的呢
前端·javascript·面试
悠哉摸鱼大王10 小时前
NV12 转 RGB 完整指南
前端·javascript
boooooooom10 小时前
深入浅出 Vue3 defineModel:极简实现组件双向绑定
vue.js