概述

我对使用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. java tcp ip网络编程(二) 套接字的基本使用

    ##基本套接字的使用 linux系统把网络io抽象成socket,对网络的编程就是对socket的编程. java把套接字抽象成类似的类 InetAddress SocketAddress 识别jav ...

  2. 用c语言基本实现wc.exe功能

    网址:https://github.com/3216005214/wc.exe wc项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿 ...

  3. git 一些实用的api

    v3 获取原始文件内容: curl -H "PRIVATE-TOKEN: <token>" -H "Content-Type: application/jso ...

  4. Read-only file system

    mount -o remount rw /  

  5. Non-decreasing Array LT665

    Given an array with n integers, your task is to check if it could become non-decreasing by modifying ...

  6. 别人的Linux私房菜(22)软件安装:源代码与Tarball

    执行make,会在当前目录查找makefile文本文件(记录了源代码如何编译的详细信息). 内核相关的函数信息放置在/usr/lib./usr/lib64里. 在Tarball(一般为xxx.tar. ...

  7. SEO常用命令大全

    SEO常用单个命令如下: link: 指某个特定网站的外部链接,这是一个主要获取排名和权重的主要因素. site: 呵呵,这个是经常用到的了,它是指某个特定网站收录情况. 用法:site: www.  ...

  8. Linux学习---位运算符

    <<.>> ① << 左移  乘以2^n m << n m*(2^n) eg:4: 0 0 1 0 0 8: 0 1 0 0 0 [数据.数字]移位 左 ...

  9. ionic 侧栏菜单用法

    第一步: 引入js和css文件我这里是直接引入的cdn,ionic是基于angular的,bundle.min.js把常用angular的js已经压缩到一起,可以直接引入.bundle.min.js, ...

  10. Oracle授权

    给连接权限 grant connect to 用户; 给资源权限 grant resource to 用户; 给DBA权限 grant dba to 用户; 授权语句 --select * from ...