基于Jquery EasyUI JSZip FileSaver的简单使用

一、前言

在前端的项目开发中 ,下载文件压缩包是很重要的一个环节,那么怎么下载多个文件并压缩成ZIP下载呢?

二、使用步骤

1、引用库

javascript 复制代码
<script type="text/javascript" src="~/Scripts/comm/jszip.min.js" ></script>
    <script type="text/javascript" src="~/Scripts/comm/FileSaver.min.js" ></script>

库下载地址:https://download.csdn.net/download/u012949335/88088658

2、简单使用方法

javascript 复制代码
var zip = new JSZip();
var zipName = "test";
var fileFolder = zip.folder(zipName);
fileFolder.file(fileList[k].name, fileList[k].content, {binary: true //二进制});
zip.generateAsync({type: 'blob'}).then(function(content){saveAs(content, zipName+'.zip');});

3、封装高级用法

javascript 复制代码
/**
*批量下载文件
*@param { Array } array 待下载数据
*@param { String } data 参数,需包含属性gndm
*@param { String } dg datagrid的id
*@param { String } url 请求下载文件url
*@param { String } filefolder 压缩文件夹
*@param { String } zipname 下载文件名称
*@param { String } field 失败显示字段名称
*@param { Boolean } tooltips 是否显示提示信息
*@example $.ajaxRecursionZipDownFile({ array: infolist, data: { "gndm": gndm }, datagrid: "XX", url: 'XXXX', filefolder: "XX附件", zipname: "XX附件.zip", field: "xh" });
*/
jQuery.ajaxRecursionZipDownFile = function (option) {
    if (typeof option === 'undefined') throw new Error("Please pass parameters");
    if (typeof option.url === 'undefined') throw new Error("Please pass parameters url");
    if (typeof option.array === 'undefined') throw new Error("Please pass parameters array");
    if (typeof option.field === 'undefined' || option.field === null) option.field = "xh";
    option.data = option.data || {};
    if (option.data.hasOwnProperty('gndm') === false) throw new Error("Please pass parameters data->gndm");
    option.zipname = option.zipname || "附件";
    option.filefolder = option.filefolder || "附件";
    option.tooltips = option.tooltips || false;
    var zip = new JSZip();
    var fileFolder = zip.folder(option.filefolder);
    var fileName = '';
    var _currentIndex = 0;
    var _successIndex = 0;
    var _faileXhInfo = '';
    var _currentTotal = option.array.length;
    pageLoadDown();
    function _recursionZipDownFiles() {
        if (_currentIndex >= _currentTotal) {
            zip.generateAsync({ type: 'blob' }).then(function (content) {
                saveAs(content, option.zipname);
                dispageload();
                var msg = "压缩成功:" + _successIndex.toString() + "个。失败数据:" + (_faileXhInfo || "无。");
                if (option.datagrid) $('#' + option.datagrid).datagrid('clearChecked');
                if (option.tooltips === true) {
                    $.messager.alert('提示', msg, 'infoxx');
                    if (!this._endmessagertimeout) {
                        window.clearTimeout(this._endmessagertimeout);
                    }
                    this._endmessagertimeout = setTimeout("$(\".messager-body\").window('close');", 1000);
                }
            });
            return false;
        }
        var jsonObject = JSON.stringify(option.array[_currentIndex]);
        var _objdata = option.data;
        _objdata.json = jsonObject;
        axios({
            method: 'post',
            url: option.url,
            data: _objdata,
            responseType: 'blob'
        }).then(function (res) {
            var data = res.data;
            var reqHeader = res.headers;
            if (reqHeader["content-disposition"]) fileName = decodeURI(reqHeader["content-disposition"]).split('; ')[1].split('filename=')[1];
            if (data.size > 0) {
                fileFolder.file(fileName, data, { binary: true });
                _successIndex++;
            } else {
                _faileXhInfo += option.array[_currentIndex][option.field] + ";";
            }
            _currentIndex++;
            _changeProcess(Math.round((_currentIndex / _currentTotal) * 100));
            _recursionZipDownFiles(option.array, option.data.gndm);
        }, function (err) {
            _currentIndex++;
            _faileXhInfo += option.array[_currentIndex][option.field] + ";";
            _changeProcess(Math.round((_currentIndex / _currentTotal) * 100));
        });
    }
    _recursionZipDownFiles();
}

4、调用示例

javascript 复制代码
 function getFilesZipDownInfo(gndm) {
        var rows = $("#dg").datagrid('getChecked');
        if (rows.length == 0) {
            $.messager.alert('提示', "请选择要下载的数据!", "error");
            return;
        }
        var infolist = [];
        $.each(rows, function (index, row) {
            var info = new Object();
            info.idxx = row.idxx;
            info.fjmcxx = row.fjmcxx;
            infolist.push(info);
        });
        $.ajaxRecursionZipDownFile({
            array: infolist,
            data: { "gndm": gndm },
            datagrid: "dg",
            url: 'downfile',
            filefolder: "实验报告附件",
            zipname: "实验报告附件.zip",
            field: "idxx",
            tooltips: true
        });
    }

5、效果展示

相关推荐
m0_zj1 小时前
8.[前端开发-CSS]Day08-图形-字体-字体图标-元素定位
前端·css
还是鼠鼠1 小时前
图书管理系统 Axios 源码__编辑图书
前端·javascript·vscode·ajax·前端框架
北极象1 小时前
vue3中el-input无法获得焦点的问题
前端·javascript·vue.js
百度网站快速收录1 小时前
网站快速收录:如何优化网站头部与底部信息?
前端·html·百度快速收录·网站快速收录
Loong_DQX2 小时前
【react+redux】 react使用redux相关内容
前端·react.js·前端框架
GISer_Jing2 小时前
react redux监测值的变化
前端·javascript·react.js
engchina2 小时前
CSS 样式化表格:从基础到高级技巧
前端·css
m0_528723812 小时前
react中useEffect的使用
前端·javascript·react.js
大模型铲屎官3 小时前
HTML从入门到精通:链接与图像标签全解析
开发语言·前端·javascript·html·编程·链接标签·图像标签
大模型铲屎官3 小时前
HTML 列表标签全解析:无序与有序列表的深度应用
前端·javascript·html·有序列表·列表标签·无序列表