博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js实现的文件下载
阅读量:4308 次
发布时间:2019-06-06

本文共 2408 字,大约阅读时间需要 8 分钟。

/**

* Javascript 多文件下载
* @author Barret Lee
* @email barret.china@gmail.com
*/
var Downer = (function(files) {
var h5Down = !/Trident|MSIE/.test(navigator.userAgent);
// try{
// h5Down = document.createElement("a").hasOwnProperty("download");
// } catch(e){
// h5Down = document.createElement("a").download;
// }

/**

* 在支持 download 属性的情况下使用该方法进行单个文件下载
* 目前 FF 还不支持 download 属性,所以 FF 必须另觅他法!
* @param {String} fileName
* @param {String|FileObject} contentOrPath
* @return {Null}
*/
function downloadFile(fileName, contentOrPath) {
var aLink = document.createElement("a"),
evt = document.createEvent("HTMLEvents"),
isData = contentOrPath.slice(0, 5) === "data:",
isPath = contentOrPath.lastIndexOf(".") > -1;

// 初始化点击事件

// 注:initEvent 不加后两个参数在FF下会报错
evt.initEvent("click", false, false);

// 添加文件下载名

aLink.download = fileName;

// 如果是 path 或者 dataURL 直接赋值

// 如果是 file 或者其他内容,使用 Blob 转换
aLink.href = isPath || isData ? contentOrPath : URL.createObjectURL(new Blob([contentOrPath]));

aLink.dispatchEvent(evt);

}

/**

* [IEdownloadFile description]
* @param {String} fileName
* @param {String|FileObject} contentOrPath
*/
function IEdownloadFile(fileName, contentOrPath, bool) {
var isImg = contentOrPath.slice(0, 10) === "data:image",
ifr = document.createElement('iframe');

ifr.style.display = 'none';

ifr.src = contentOrPath;

document.body.appendChild(ifr);

// dataURL 的情况

isImg && ifr.contentWindow.document.write("<img src='" +
contentOrPath + "' />");

// 保存页面 -> 保存文件

// alert(ifr.contentWindow.document.body.innerHTML)
if (bool) {
ifr.contentWindow.document.execCommand('SaveAs', false, fileName);
document.body.removeChild(ifr);
} else {
setTimeout(function() {
ifr.contentWindow.document.execCommand('SaveAs', false, fileName);
document.body.removeChild(ifr);
}, 0);
}
}

/**

* [parseURL description]
* @param {String} str [description]
* @return {String} [description]
*/
function parseURL(str) {
return str.lastIndexOf("/") > -1 ? str.slice(str.lastIndexOf("/") + 1) : str;
}

return function(files) {

// 选择下载函数
var downer = h5Down ? downloadFile : IEdownloadFile;

// 判断类型,处理下载文件名

if (files instanceof Array) {
for (var i = 0, l = files.length; i < l; i++)
// bug 处理
downer(parseURL(files[i]), files[i], true);
} else if (typeof files === "string") {
downer(parseURL(files), files);
} else {
// 对象
for (var file in files) downer(file, files[file]);
}
}

})();

转载于:https://www.cnblogs.com/djawh/p/4359506.html

你可能感兴趣的文章
Python 环境搭建
查看>>
免费字典api ,查询汉字完整信息
查看>>
Flume协作框架
查看>>
基于数据库的事务消息解决分布式事务方案
查看>>
HDU 2461 Rectangles#容斥原理
查看>>
网口扫盲二:Mac与Phy组成原理的简单分析(转)
查看>>
使用最大似然法来求解线性模型(1)
查看>>
EF 从sqlserver2008 迁移到 2005出现的BUG
查看>>
架构-浅谈MySQL数据库优化
查看>>
jquery锚点连接划动滚动条,再也不用a标签name 了
查看>>
Apache JMeter--网站自动测试与性能测评
查看>>
信号与系统(中)
查看>>
【iCore4 双核心板_FPGA】例程八:乘法器实验——乘法器使用
查看>>
bash 快捷键
查看>>
检测登录按钮 ,回车即登录
查看>>
蓝桥杯-微生物增殖
查看>>
ansible for devops读书笔记第一章
查看>>
解决IE6下,给图片加上line-height属性不起作用的方法
查看>>
#10172. 「一本通 5.4 练习 1」涂抹果酱 题解
查看>>
vue-cli 3.0安装和使用
查看>>