使用JavaScript下载csv文件
前端可以使用JavaScript在客户端下载包含页面数据的文件,这里以下载CSV格式文件为例,代码如下:
function downloadData(data, filename, type) {
var file = new Blob(["\ufeff" + data], { type: type });
if (window.navigator.msSaveOrOpenBlob)
// IE10+
window.navigator.msSaveOrOpenBlob(file, filename);
else {
// Others
var a = document.createElement("a"),
url = URL.createObjectURL(file);
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(function() {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 0);
}
}
让我们解释一下这段代码:
(一)downloadData 函数
首先,downloadData函数接收三个参数:
data:需要下载的数据(注意数据格式需要符合csv格式规范);filename:需要下载的文件名,注意需要添加符合数据格式的文件名的后缀,这提示了操作系统应该以何种方式打开;type:代表了将会被放入到Blob对象中的数组内容的MIME类型;
(二)Blob 构造函数
接着,我们来解析下面这条语句:
var file = new Blob(["\ufeff" + data], { type: type });
可以看到,我们使用了Blob构造函数,创建了一个Blob实例对象file。Blob构造函数有什么用呢?它接收的两个参数是什么?让我们在下面一一作答:
① Blob 构造函数的作用
Blob构造函数会根据传入的数组参数构造出一个新的Blob对象实例,该对象实例的值由以下两步生成:
- Blob构造函数会将第一个参数,即一个数组内的所有值串联起来;
- Blob会将被串联的值转换为二进制编码的数据然后返回;
注意,Blob对象实例的值是不可变的,它只有两个只读的属性:size:表示对象中所包含数据的大小(单位是字节),以及type:值是一个字符串,表示该对象实例所包含数据的MIME类型(即我们传入Blob构造函数的第二个参数中指定的type值,默认为"")。
② Blob 构造函数接收的参数
Blob构造函数接收的第一个参数为数组类型,数组内的所有值会在实例化时被串联。若传入数组的值中有DOMString类型的值,则会被编码为UTF-8格式。而为了让导出的CSV格式文件在Excel中打开时,中文不出现乱码,需要在数组的首位添加一个BOM(Byte Order Mark “字节次序标记”)头\ufeff。
BOM是一个不可见的字符,它是ES5新增的空白符,在Unicode3.2之前,\uFEFF表示“零宽不换行空格(Zero Width No-Break Space)”,但在Unicode3.2之后,新增了\u2060表示零宽不换行空格,\uFEFF就只用来表示字节次序的标记了。而在Microsoft中,其记事本程序发明了一种UTF-8变体(Python 2.5称为“utf-8-sig”)以提高可检测到UTF-8编码的可靠性,该编码要求在任何Unicode字符被写入之前都需要编写一个UTF-8编码的BOM(看起来像是一个字节序列:0xef,0xbb,0xbf)。
Blob构造函数接收的第二个参数是一个对象,该对象有以下两个属性:
type:默认值为"",它表示第一个参数内,数组内容的MIME类型;options:这个属性目前还没有被很好的支持,所以不用管它;
总之,我们通过new Blob()获得了一个Blob类型的二进制文件。
(三)下载文件
接着我们要做的便是下载我们生成好的文件了,有两种方式,第一种方式最简单,因为IE浏览器直接提供了下载文件的接口window.navigator.msSaveOrOpenBlob(file, filename);,正如函数签名所示,我们只需要向函数中传入我们生成好的二进制文件,以及文件名就可以让浏览器自动下载文件了。
抛下IE浏览器,要实现文件下载就稍微麻烦些,我们需要通过创建一个a标签,并模拟点击这个a标签实现文件下载,让我们将与之相关的代码贴在下面:
var a = document.createElement("a"),
url = URL.createObjectURL(file);
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(function() {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 0);
注意这段代码的第二行,我们会发现一个新的API:URL.createObjectURL()函数,这个函数接收一个参数,一个Blob对象,并为该对象生成一个指向该对象的URL对象,需要注意的是只要当下文档没有被关闭,该URL对象就会一直存储在内存中不会被回收,因此一旦确定不再需要该URL对象,一定要及时使用URL.revokeObjectURL()清理。
以上,我们就解释了在前端以CSV格式下载数据的方法和原理,需要注意的是,该段代码只适用于IE10及以上的现代浏览器,因为无论是Blob构造函数还是URL.createObjectURL()API都只有这些浏览器提供支持。
使用JavaScript下载csv文件的更多相关文章
- javascript导出csv文件(excel)
这里贴出JavaScript导出csv文件(excel)的代码. /** * 导出excel * @param {Object} title 标题列key-val * @param {Object} ...
- 利用php CI force_download($filename, $data) 下载.csv 文件解决文件名乱码,文件内容乱码
利用php CI force_download($filename, $data) 下载.csv 文件解决文件名乱码,文件内容乱码 2014-07-31 12:53 1047人阅读 评论(0) 收藏 ...
- response下载csv文件内容乱码问题
response下载csv文件内容乱码问题 解决办法:在输出流语句第一行输出 out.write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF}); Se ...
- 108.生成和下载csv文件
生成CSV文件 有时候我们做的网站,需要将一些数据,生成一个csv文件返回浏览器,并且是作为附件的形式下载下来. 生成小的csv文件: 生成一个小的csv文件,我们用Python内置的csv模块来处理 ...
- js实现使用文件流下载csv文件
1. 理解Blob对象 在Blob对象出现之前,在javascript中一直没有比较好的方式处理二进制文件,自从有了Blob了,我们就可以使用它操作二进制数据了.现在我们开始来理解下Bolb对象及它的 ...
- 上载和下载CSV文件
sap中把txt .excel .文件上载到内表中,txt和csv速度最快. excel文件导出的csv是用,分隔符分隔的,如果单元格的文本中就有逗号,这样会和分隔符逗号混淆,最好abap产生csv文 ...
- 【Github】如何下载csv文件/win10如何修改txt文件为csv文件
csv文件:逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号) 右键点击raw按钮,选择目标另存为,下载的是txt文件 win10如何 ...
- 如何从GitHub下载csv文件
当打开存.csv文件的页面时,不用直接点击页面的Download,这样会使csv文件直接用浏览器打开. 要点击Raw按钮,鼠标右键,文件另存为,可以直接把csv文件下载到本地.
- 将php数据下载csv文件
<?php $sales = array( array( 'Northeast', '2005-01-01', '2005-02-01', 12.54 ), array( 'Northwest' ...
随机推荐
- 2.5 CMMI2级——配置管理(Configuration Management)
我们先需要回答,什么是 配置管理? 这个问题好难回答,我们可以找到很多解释,但真正理解配置管理的人可能不多. 配置管理的概念非常多,我们可不愿意做理论家,我们是非常务实的,我们先看看,如果没有有效的配 ...
- 解决:Bitmap too large to be uploaded into a texture exception
前几天拿锤子手机做测试,启动页面的闪屏直接黑屏.. 所以看下日志,百度一下 找到解决方案,特此记录. 简单说就是硬件加速的时候,对图片的大小有限制.不同设备可能有不同的最大值.这个问题悲催的地方是,程 ...
- mysql5.6主从
1.环境 操作系统:centos6.5(主服务器IP:192.168.100.170,从服务器IP:192.168.100.171)软件版本:mysql5.6.24 2.开始安装: a.主库上设置从库 ...
- backup与recover
完全恢复: 1.关闭DB2.拷贝文件3.启动DB.<出错>startup mount4.recover database until cancel using backup control ...
- 使用angular路由切换后 轮播以及iscrollJs失效的问题
我们在使用angular的时候,路由总是最让人头疼的地方. 在这里为大家解决一些用angular来回切换遗留下的小问题 比如我们在使用ng-route时如果主页面含有轮播图,当你切换到其他页面再切回主 ...
- 传智播客微金所项目实战移动web开发
1.源码笔记 我的源码+笔记(很重要):链接: http://pan.baidu.com/s/1kULKqcJ 感谢传智播客项目相关视频:1.6天 链接: https://pan.baidu.com/ ...
- oracle的认证方式
使用as sysdba是使用操作系统验证方式,不需要输入密码
- Java编程思想第四版勘误
坊间传说这本书翻译得很烂,我倒觉得还好.虽然看原文更准确,但是如果在具备一定编程思维和基础.能够看出来疑问的情况下,还是看中文更快一些,而且这本书本身也不适合初学者看.当然,错误和不通顺还是有的,而且 ...
- 使用CXF做webservice整合现有项目的例子
从网上看了很多CXF的资料,大部分都是单独的作为一个webservice项目,对于在现有的spring项目上提供webservice服务的例子基本没有找到. 我做的这个例子是介绍怎么把cxf整合到现有 ...
- Asm 常用资源
masm:http://www.aogosoft.com/masm:http://www.asmirvine.comasm:http://asm.yeah.netwin32asm:http://win ...