HTML5 Blob 实现文件下载功能的示例代码


Posted in HTML / CSS onNovember 29, 2019

原理其实很简单,就是将文本或者JS字符串信息(即后台返回来的在服务器上没有具体路径的动态文件,如导出数据功能)借助Blob转换成二进制,然后,作为 a 标签的 href 属性,配合download属性,实现下载功能,缺点是如果文件太大会下载失败。

下面是导出数据的一个实例:

$("#exportAll").on("click",function(){     //点击【全部导出】
    //layer.load();
    var province = $('#operatingData select[name=\'province\'] option:selected').val();  //查询条件(省)
    var city = $('#operatingData select[name=\'city\'] option:selected').val();    //查询条件(市)

    var url = '/xxx/excelAllDownload';      //【全部导出】请求url
    var xhr = new XMLHttpRequest();
    xhr.open('POST', url, true);
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.responseType = "blob";   //返回类型blob
    xhr.onload = function () {   //定义请求完成的处理函数
        //layer.closeAll('loading');
        if (this.status === 200) {
            var blob = this.response;
            var reader = new FileReader();
            reader.readAsDataURL(blob);   // 转换为base64,可以直接放入a标签href
            reader.onload = function (e) {
                var a = document.createElement('a');   // 转换完成,创建一个a标签用于下载
                a.download = 'XX数据.xlsx';
                a.href = e.target.result;
                $("body").append(a);    // 修复firefox中无法触发click
                a.click();
                $(a).remove();
            }
        }else if(this.status === 504){
            alert('导出失败,请求超时');
            //layer.msg('导出失败,请求超时', {icon: 2});
        }else{
            alert('导出失败');
            //layer.msg('导出失败', {icon: 2});
        }
    };
    xhr.send("province=" + province + "&city=" + city);
})

上面是在服务器动态生成excel文件时使用的下载方式,因为对应的 URL 并不存在,我们就不能简单的指定 href 属性。

但是不同浏览器对 Blob (类文件对象)有不同的大小限制,这种借助Blob转换成二进制 实现下载功能的方式并不能导出数据量过多的数据到excel文件(即不能下载太大的文件),且有兼容性问题。

HTML5 Blob 实现文件下载功能的示例代码

所以,我们可以通过 JavaScript 对服务器发出一个请求,通知它去生成某个文件,然后把对应的 URL 返回给客户端。代码如下:(此时的请求结果为一个已经存在于服务器上面的静态文件的路径)

$("#exportAll").on("click",function(){     //点击【全部导出】
    var url = '/xxx/excelAllDownload';     //【全部导出】请求url
    var xhr = new XMLHttpRequest();
    xhr.open('POST', url, true);
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.responseType = "blob";   //返回类型blob
    xhr.onload = function () {   //定义请求完成的处理函数
        if (this.status === 200) {
            //方式一实现静态文件下载,不能自定义下载文件名字
            //location.href = "json/abc.xlsx";  //this.response(返回的服务器上的静态文件路径)

            //方式二实现静态文件下载,可以自定义下载文件名字
            var a = document.createElement('a');  //创建a标签用于下载
            a.download = 'XXX数据.xlsx';
            a.href = "json/abc.xlsx";  //this.response(返回的服务器上的静态文件路径)
            $("body").append(a);       // 修复firefox中无法触发click
            a.click();
            $(a).remove();
        }else if(this.status === 504){
            alert('导出失败,请求超时');
        }else{
            alert('导出失败');
        }
    };
    xhr.send();
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3 制作旋转的大风车(充满童年回忆)
Jan 30 HTML / CSS
CSS3控制HTML元素动画效果
Feb 08 HTML / CSS
CSS3感应鼠标的背景闪烁和图片缩放动画效果
May 14 HTML / CSS
详解CSS3中border-image的使用
Jul 18 HTML / CSS
CSS3中的@keyframes关键帧动画的选择器绑定
Jun 13 HTML / CSS
CSS3为背景图设置遮罩并解决遮罩样式继承问题
Jun 22 HTML / CSS
一篇文章带你学习CSS3图片边框
Nov 04 HTML / CSS
HTML5-WebSocket实现聊天室示例
Dec 15 HTML / CSS
HTML5如何实现元素拖拽
Mar 11 HTML / CSS
HTML5 预加载让页面得以快速呈现
Aug 13 HTML / CSS
HTML5 canvas基本绘图之文字渲染
Jun 27 HTML / CSS
html5调用摄像头实例代码
Jun 28 HTML / CSS
使用数据结构给女朋友写个Html5走迷宫游戏
Nov 26 #HTML / CSS
五分钟学会HTML5的WebSocket协议
Nov 22 #HTML / CSS
通过canvas转换颜色为RGBA格式及性能问题的解决
Nov 22 #HTML / CSS
HTML5 weui使用笔记
Nov 21 #HTML / CSS
移动端html5判断是否滚动到底部并且下拉加载
Nov 19 #HTML / CSS
Html5之自定义属性(data-,dataset)
Nov 19 #HTML / CSS
如何给HTML标签中的文本设置修饰线
Nov 18 #HTML / CSS
You might like
第十三节 对象串行化 [13]
2006/10/09 PHP
PHP对MongoDB[NoSQL]数据库的操作
2013/03/01 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
用js实现小球的自由移动代码
2013/04/22 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
jquery 设置style:display的方法
2015/01/29 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
js中bool值的转换及“&&”、“||”、 “!!”详解
2017/12/21 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
layer 关闭指定弹出层的例子
2019/09/25 Javascript
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
Python实现类继承实例
2014/07/04 Python
Python使用minidom读写xml的方法
2015/06/03 Python
python实现数独算法实例
2015/06/09 Python
基于Python和Scikit-Learn的机器学习探索
2017/10/16 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
软件工程专业推荐信
2013/10/28 职场文书
往来会计岗位职责
2013/12/19 职场文书
保护环境建议书100字
2014/05/13 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
作风建设年活动总结
2014/08/27 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
车辆年检委托书范本
2014/10/14 职场文书
长江三峡导游词
2015/01/31 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
OpenCV全景图像拼接的实现示例
2021/06/05 Python