概述

我对使用js控制下载非常感兴趣,在网上查资料的时候碰巧看到了相关实现方法,记录下来供以后开发时参考,相信对其他人也有用。

参考资料:

JS前端创建html或json文件并浏览器导出下载

理解DOMString、Document、FormData、Blob、File、ArrayBuffer数据类型

实现方法

一种实现方法是利用H5中的download属性。如果给a标签加了这个属性的话,点击a标签不会跳到链接或者打开图片,而是会直接下载资源。示例如下:

<a href="large.jpg" download>下载</a>

注意:这个属性的兼容性很差,貌似不兼容safara,并且仅适用于同源URL。

于是我们的实现方法是,在用户点击的时候,给html添加一个拥有href和download属性的a标签,然后用js对a标签进行点击,然后就可以自动下载了。相关代码如下:

var link = document.createElement('a');
//设置下载的文件名
link.download = filename;
link.style.display = 'none';
//设置下载路径
link.href = src;
//触发点击
document.body.appendChild(link);
link.click();
//移除节点
document.body.removeChild(link);

然后怎么来获得这个下载路径src呢?下面介绍2种方法。

利用canvas转base64下载图片

我们都知道,利用canvas可以把画布转化为一个base64的图片,这个base64代码就是图片源。示例如下:

var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
//这里在canvas上面进行一些操作 //这里导出src,然后把这里的src赋给上面的src即可
var src = context.toDataURL('image/jpeg');

利用Blob对象下载文本

我们可以把文本用Blob对象转化为二进制,然后利用上面的方法下载。示例如下:

//content是文本或字符串内容
var blob = new Blob([content]); //这里导出src,然后把这里的src赋给上面的src即可
var src = URL.createObjectURL(blob);

对于创建blob对象,有下面几个示例:

//创建字符串对象
var blob1 = new Blob([JSON.stringify(obj)]); //创建一个DOMString对象
var s = '<div>Hello World!!</div>'
var blob2 = new Blob([s], {type: 'text/xml'}); //创建一个ArrayBuffer对象
var abf = new ArrayBuffer(8);
var blob3 = new Blob([abf], {type: 'text/plain'});

另外canvas有一个toBlob的api,使用示例如下:

var canvas = document.getElementById('canvas');

canvas.toBlob(function(blob) {
var newImg = document.createElement('img'),
url = URL.createObjectURL(blob); newImg.onload = function() {
// no longer need to read the blob so it's revoked
URL.revokeObjectURL(url);
}; newImg.src = url;
document.body.appendChild(newImg);
});

JS 实现触发下载内容(H5 download)的更多相关文章

  1. js 根据url 下载图片 前端js 实现文件下载

    1.H5 download属性 function downFile(content, filename) { // 创建隐藏的可下载链接 var eleLink = document.createEl ...

  2. JS弹出下载对话框以及实现常见文件类型的下载

    写在前面 JS要实现下载功能,一般都是这么几个过程:生成下载的URL,动态创建一个A标签,并将其href指向生成的URL,然后触发A标签的单击事件,这样就会弹出下载对话框,从而实现了一个下载的功能. ...

  3. js之Ajax下载文件

    传统上,客户端将依靠浏览器来处理从服务器下载文件.然而,这种方法需要打开一个新的浏览器窗口,iframe或任何其他类型的不友好和黑客行为.为下载请求添加额外的头信息也很困难.更好的解决方案是使用HTM ...

  4. js通过 URL下载文件

    页面上一个button,点击之后触发一个function去请求数据,返回 pdf/epub 的URL,然后下载这个文件. 本来是直接用 a 写的,href里放资源地址,target设为'_blank' ...

  5. js 上传下载(留着备用)

      js 上传下载(留着备用) 下载文件 1. <a href="#" onClick="download()">下载文件</a>  & ...

  6. 百度网盘不限速下载软件 Pan Download

    百度网盘不限速下载软件 Pan Download Pan Download下载软件是一款电脑端的快速下载器软件,您可以通过Pan Download直接下载百度网盘中的资源,此款软件下载速度快,下载压缩 ...

  7. 外部JS的阻塞下载

    转载于:http://www.cnblogs.com/mofish/archive/2011/09/29/2195256.html 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载, ...

  8. js实现图片下载

    <img src='src' data-name='自定义名称'><script>//js实现图片下载 function download(){ var name = $('# ...

  9. 2018-11-8-WPF-获取下载内容长度

    title author date CreateTime categories WPF 获取下载内容长度 lindexi 2018-11-08 20:18:15 +0800 2018-11-08 20 ...

随机推荐

  1. mactype配置

    配合 Firefox 小小设置(改了好多配置,似乎主要是修改了渲染的核心?是叫这个么?把那个Siera?删掉了,就好了)后,效果极佳,我在原有配置的基础上,加大了字重,显示更粗,更明显. 这里是原配置 ...

  2. HDU 6161.Big binary tree 二叉树

    Big binary tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  3. 1. String可调用方法

    class str(basestring): """ str(object='') -> string Return a nice string represent ...

  4. JS生成URL二维码

    需求:项目中需要在UI界面有一个二维码,扫码后可以跳转到二维码包含的URL. 解决方案:在前端用js生成一个包含URL等信息的二维码. 实现: 方案一. <!DOCTYPE HTML PUBLI ...

  5. 《Linux就该这么学》第十七天课程

    想学Squid可以前往https://www.linuxprobe.com/chapter-16.html讲的非常细 Squid服务程序提供正向代理服务 Squid服务程序提供的反向代理模式

  6. 安装 redis 拓展

    PHP API 20121113 PHP Extension 20121212 Zend Extension 220121212 Zend Extension Build API220121212,T ...

  7. python3中报错:TypeError: 'range' object doesn't support item deletion

    1.源代码 以下代码执行时会报  range' object does not support item assignment 的错误,问题出现在第17行的runge(10): import unit ...

  8. HDU 5355 Cake (构造 + 暴力)

    题意:给定 n,m,让你把 1 ~ n 分成 m 部分,而且每部分和是一样大的. 析:首先先判断不能分成的,第一种是 sum (1 ~ n 的和)不能被 m 整除,或者 sum / m < n, ...

  9. [Java练习题] -- 1. 使用java打印杨辉三角

    package cn.fzm.demo1.array; import java.util.Scanner; /* * 需求:打印杨辉三角形(行数可以键盘录入) 1 1 1 1 2 1 1 3 3 1 ...

  10. 【慕课网实战】二、以慕课网日志分析为例 进入大数据 Spark SQL 的世界

    MapReduce的局限性: 1)代码繁琐: 2)只能够支持map和reduce方法: 3)执行效率低下: 4)不适合迭代多次.交互式.流式的处理:   框架多样化: 1)批处理(离线):MapRed ...