vue项目使用jszip和file-saver批量打包压缩图片或附件方式

 更新时间:2024年03月08日 09:47:33   作者:小破孩呦  
这篇文章主要介绍了vue项目使用jszip和file-saver批量打包压缩图片或附件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

使用jszip和file-saver批量打包压缩图片或附件

背景:

图片上传功能用户会批量上传好多个,并且图片可能还会很大,于是就采用了前端先压缩,然后将压缩包直接传给后端。

1、安装插件:

npm install jszip
npm install file-saver

2、在页面中引入插件:

import JSZip from 'jszip';
import FileSaver from 'file-saver'; 
// 定义全局的 zip
const zip = new JSZip();

注释:在引入组件的位置定义一个全局的 zip 用于文件的压缩

3、element UI 上传组件:

<el-upload
    class="upload-demo"
    accept=".jpg,.JPG,.png,.PNG"
    action="#"
    :multiple="true"
    :auto-upload="false"
    :on-change="handleChange1"
    :show-file-list="false"
    :file-list="fileList1">
    <el-button size="small" type="primary">选择文件</el-button>
</el-upload>
<el-button class="handle-upload" size="small" type="primary" @click="uploadData()" :loading="loadingFile1">开始上传</el-button>

4、初始化 data 数据:

export default {
    data() {
        return {
            fileList1: [], // 待上传图片数据
        }
    }
}

5、添加图片选择的 onchange 方法:

export default {
    methods: {
        // 上传图片
        handleChange1(file, fileList) {
            const that = this;
            const _file = file.raw;
            let blob = new Blob([_file], { type: _file.type});
            zip.file(_file.name, blob);
            this.fileList1 = fileList;
        },
        // 开始上传
        uploadData(){
            // 生成 ZIP 文件
            zip.generateAsync({ type: 'blob' })
            .then(function (zipBlob) {
                // 在这里可以进行上传操作,将 zipBlob 发送到服务器
                // 也可以通过 FileSaver.js 将 ZIP 文件保存到本地
                FileSaver.saveAs(zipBlob, '压缩包名称.zip');
             })
             .catch(function (error) {
                console.error('压缩视频失败:', error);
             });
        }
    }
}

注释:zip. 属性是在第二步中进行定义的,具体请参考第二步

至此前端附件压缩完成!!!

附加:从服务器获取附件,进行压缩下载

1、安装插件:

npm install jszip

2、在页面中引入插件:

import JSZip from 'jszip';

3、第3 、4步同上

5、添加图片选择的 onchange 方法:

export default {
    methods: {
        // 图片压缩前转换
        imgToBuffer(url) {
           return new Promise((resolve, reject) => {
             const xml = new XMLHttpRequest();
             xml.open('GET', url, true);
             xml.responseType = 'blob';
             xml.onload = function ({ currentTarget }) { //从事件对象结构出currentTarget
               const { status, response } = currentTarget;
               status === 200 ? resolve(response) : reject(status); // response就是转化后的
             };
             xml.send();
           });
        },
        // 开始压缩
        uploadData(){
            const zip = new JSZip();
            const imgCache = {};
            const imgArr = [];
            let list = [
                    {name: '测试图片1', url: 'https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF'},
                    {name: '测试图片2', url: 'https://t7.baidu.com/it/u=727460147,2222092211&fm=193&f=GIF'},
                    {name: '测试图片3', url: 'https://t7.baidu.com/it/u=3911840071,2534614245&fm=193&f=GIF'},
                    {name: '测试图片4', url: 'https://t7.baidu.com/it/u=938052523,709452322&fm=193&f=GIF'},
             ];
             list.forEach((item) => { // urlList格式:[{url:图片链接,name:图片名称}...]
                // 逐个添加文件
                const promise = this.imgToBuffer(item.url).then((res) => { 
                    zip.file(`${item.name}.${res.type.split('/').pop()}`, res, { binary: true }); 
                    imgCache[item.name] = res; // 下载文件, 并存成ArrayBuffer对象(blob)
                });
                imgArr.push(promise);
            });
            Promise.all(imgArr).then(() => {
                zip.generateAsync({ type: 'blob' }).then((content) => {
                    saveAs(content, '压缩包名称'); // 打包压缩
                    this.$message.success('压缩完成');
                }).catch((err) => {
                    this.$message.error(err.message);
                });
            });
        }
    }
}

至此完成压缩下载!!!

总结

以上测试有效,感谢支持!!!

这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue项目proxyTable配置小结

    vue项目proxyTable配置小结

    本文主要介绍了vue项目proxyTable配置小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • vue引入外部的js文件的10种方法总结

    vue引入外部的js文件的10种方法总结

    这篇文章主要为大家详细介绍了vue项目中引入外部的js文件的10种方法,文中的示例代码讲解详细,具有一定的借鉴价值,需要的小伙伴可以参考下
    2023-08-08
  • Vue--Router动态路由的用法示例详解

    Vue--Router动态路由的用法示例详解

    这篇文章主要介绍了Vue--Router动态路由的用法,很多时候,我们需要将给定匹配模式的路由映射到同一个组件,在 Vue Router 中,我们可以在路径中使用一个动态字段来实现,我们称之为路径参数,本文对Vue Router动态路由相关知识给大家介绍的非常详细,需要的朋友参考下吧
    2022-08-08
  • 基于vue3+antDesign2+echarts 实现雷达图效果

    基于vue3+antDesign2+echarts 实现雷达图效果

    这篇文章主要介绍了基于vue3+antDesign2+echarts 实现雷达图,本文通过实例代码图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • mpvue全局引入sass文件的方法步骤

    mpvue全局引入sass文件的方法步骤

    这篇文章主要介绍了mpvue全局引入sass文件的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • element ui表格实现下拉筛选功能

    element ui表格实现下拉筛选功能

    这篇文章主要为大家详细介绍了element ui表格实现下拉筛选功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • mini-vue渲染的简易实现

    mini-vue渲染的简易实现

    本文主要介绍了mini-vue渲染的简易实现,主要简单来实现一个虚拟dom渲染真实dom,以及更新的方法。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • vue本地打开build后生成的dist文件夹index.html问题

    vue本地打开build后生成的dist文件夹index.html问题

    这篇文章主要介绍了vue本地打开build后生成的dist文件夹index.html问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-09-09
  • 基于Vue2.X的路由和钩子函数详解

    基于Vue2.X的路由和钩子函数详解

    下面小编就为大家分享一篇基于Vue2.X的路由和钩子函数详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • vue 解决IOS10低版本白屏的问题

    vue 解决IOS10低版本白屏的问题

    这篇文章主要介绍了vue 解决IOS10低版本白屏的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11

最新评论