JS 下载/导出 csv、excel、txt 、img等文件的方法总结
栏目: JavaScript · 发布时间: 6年前
内容简介:会打开一个新窗口,开始下载后会自动关闭新窗口。Safair 下载后没有关闭新窗口。Chrome、IE、Safair支持,貌似火狐不支持在当前窗口下载
会打开一个新窗口,开始下载后会自动关闭新窗口。Safair 下载后没有关闭新窗口。
Chrome、IE、Safair支持,貌似火狐不支持
1.2 window.location=url
在当前窗口下载
Chrome、Safair支持
1.3 iframe
function downloadByIframe (url) {
try {
const iframe = document.createElement('iframe');
iframe.src = url;
iframe.style.display = 'none';
document.body.appendChild(iframe);
} catch (e) {
}
}
复制代码
<button onclick="downloadByIframe(url)">下载</button> 复制代码
在HTML中,iframe 的属性用src,但在JS中,只有部份浏览器支持修改src(读是没问题),真正通用的是要修改对应框架的href值。
function changeIframeSrc (url) {
window.iframes['myIframe'].location.href = url;
}
复制代码
1.4 <a href="url" download="filename">点击链接下载</a>
function downloadByAElement (url, fileName) {
try {
const element = document.createElement('a');
element.href = url;
element.download = fileName;
const a = document.body.appendChild(element);
a.click();
document.body.removeChild(element);
} catch (e) {
}
}
downloadByAElement ('https://gold-cdn.xitu.io/extension/0.3.9/package.crx', 'test');
复制代码
HTML5中给a标签增加了一个download属性,只要有这个属性,点击这个链接时浏览器就不在打开链接指向的文件,而是改为下载,目前只有chrome、firefox、opera、Edge支持。常用此方法点击下载图片。
IE既不支持a标签的download属性也不允许js调用a 标签的click方法。
2. 前端直接导出文件到本地
2.1 将数据转成DataURI用 <a>
标签下载
<a href="DataURI" download="filename">点击链接下载</a>
function saveData2File (data, fileName) {
try {
const element = document.createElement('a');
cosnt uri = getDownloadUri(data);
element.href = uri;
element.download = fileName;
const a = document.body.appendChild(element);
cosnt evt = document.createEvent('HTMLEvents');
evt.initEvent('click', false, false); // 不加后面两个参数在Firefox上报错
a.dispatchEvent(evt);
document.body.removeChild(element);
} catch (e) {
}
}
复制代码
注意: 浏览器对href属性的URL长度有限制,若超过浏览器自身限制的最大长度会导致下载失败。
| 浏览器 | 最大长度(字符数) | 备注 |
|---|---|---|
| IE | 2083 | 如果超过这个数字,提交按钮没有任何反应 |
| Firefox | 65,536 | - |
| Chrome | 8,182 | - |
| Safari | 80,000 | - |
| Opera | 190,000 |
Data URI Scheme
Data URI Scheme
是指可以在Web 页面中包含图片但无需任何额外的HTTP 请求的一类URI。 Data URI Scheme
一般用于将经过base64编码的数据嵌入网页中,从而减少请求资源的链接数。IE8 之前的版本都不支持 data URI scheme
。
DataURI
的格式:
data: [<mime-type>][;charset=<charset>][;<encoding>],<encoded data> 复制代码
-
data:协议名称 -
[<mime-type>]可选项,数据类型,常用的有image/png,image/svg+xml,text/plain -
[;charset=<charset>]可选项,源文本的字符集编码方式。[<mime type>][;charset=<charset>]的缺省值为HTTP Header 中Content-Type的字段值; -
[;<encoding>]数据编码方式(有US-ASCII,BASE64 两种),默认值为US-ASCII,就是每个字符会编码为%xx的形式 -
,<encoded data>编码后的数据, 如果<encoded data>不是以[;<encoding>]方式编码的数据,则会报异常
生成 DataURI
的方式
function getDownloadUri (data) {
const mimeType = 'attachment/csv';
const charset = ';charset=utf-8,';
const _utf = '\uFEFF'; // 为了使文件以utf-8的编码模式,同时也是解决中文乱码的问题
return 'data:' + mimeType + charset + _utf + encodeURIComponent(data)
}
复制代码
使用这种方式,当数据过多时,URI长度容易超出浏览器限制。 encodeURIComponent
常用来转码接口参数,为了避免服务器收到不可预知的请求,对任何用户输入的作为URI部分的内容都需要用encodeURIComponent进行转义。
2. URL.createObjectURL
URL.createObjectURL
的参数是 File
对象或者 Blob
对象
-
File对象也就是通过input[type=file]选择的文件 -
Blob对象表示一个不可变、原始数据的类文件对象
IE10以下不支持 URL.createObjectURL
function getDownloadUri (data) {
const _utf = '\uFEFF'; // 为了使文件以utf-8的编码模式,同时也是解决中文乱码的问题
if (window.Blob && window.URL && window.URL.createObjectURL) {
const blob = new Blob([_utf + data], {
type: 'text/json' // 写自己需要的数据格式
});
return URL.createObjectURL(blob);
}
}
复制代码
2.2 windows.navigator.msSaveBlob
IE10~Edge 专用
msSaveBlob 是IE10~Edge 私有方法。
function downloadByMsSaveBlob (data) {
const _utf = '\uFEFF';
var blob = new Blob([_utf + data], {
type: 'text/json' // 自己需要的数据格式
});
navigator.msSaveBlob(_csvData, fileName);
}
复制代码
2.3
execCommand
当一个HTML文档切换到 设计模式 时,document暴露 execCommand 方法,该方法允许运行命令来操纵可编辑内容区域的元素。
有的资料有提到IE9可以使用 execCommand
方法来保存数据到本地文件,但是我自己没有验证过,不知道是否可行。
function saveFileByExecCommand (data, fileName) {
const newWindow = window.top.open('about:blank', '_blank');
newWindow.document.write('sep=,\r\n' + data);
newWindow.document.close();
newWindow.document.execCommand('SaveAs', false, fileName);
newWindow.close();
}
复制代码
js数据直接导出/下载数据到本地到方法总结
function saveData2File (data, fileName) {
const bw = getBrowser(); // 获取浏览器信息
if (!bw['edge'] || !bw['ie']) {
const element = document.createElement('a');
cosnt uri = getDownloadUri(data);
element.href = uri;
element.download = fileName;
const a = document.body.appendChild(element);
cosnt evt = document.createEvent('HTMLEvents');
evt.initEvent('click', false, false); // 不加后面两个参数在Firefox上报错
a.dispatchEvent(evt);
document.body.removeChild(element);
} else if (bw['ie'] >= 10 || bw['edge'] === 'edge') {
const blob = createBlob(data);
navigator.msSaveBlob(blob, fileName);
}
}
function getBrowser () {
const sys = {};
const ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('edge') !== -1) {
sys.edge = 'edge';
} else if (ua.match(/rv:([\d.]+)\) like gecko/)) {
sys.ie = ua.match(/rv:([\d.]+)\) like gecko/)[1];
} else if (ua.match(/msie ([\d.]+)/)) {
sys.ie = ua.match(/msie ([\d.]+)/)[1];
} else if (ua.match(/firefox\/([\d.]+)/)) {
sys.firefox = ua.match(/firefox\/([\d.]+)/)[1];
} else if (ua.match(/chrome\/([\d.]+)/)) {
sys.chrome = ua.match(/chrome\/([\d.]+)/)[1];
} else if (ua.match(/opera.([\d.]+)/)) {
sys.opera = ua.match(/opera.([\d.]+)/)[1];
} else if (ua.match(/version\/([\d.]+).*safari/)) {
sys.safari = ua.match(/version\/([\d.]+).*safari/)[1];
}
return sys;
}
复制代码
以上所述就是小编给大家介绍的《JS 下载/导出 csv、excel、txt 、img等文件的方法总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- ASP.NET 开源导入导出库Magicodes.IE 导出Pdf教程
- MrDoc 0.5.0 版本发布,优化 EPUB 导出,新增 PDF 导出,支持自定义思维导图
- php 导出 excel
- oracle导出序列sequence
- vue导出excel表格
- Phoenix 数据导入与导出
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Open Data Structures
Pat Morin / AU Press / 2013-6 / USD 29.66
Offered as an introduction to the field of data structures and algorithms, Open Data Structures covers the implementation and analysis of data structures for sequences (lists), queues, priority queues......一起来看看 《Open Data Structures》 这本书的介绍吧!