一、HTML与文件下载

如果希望在前端侧直接触发某些资源的下载,最方便快捷的方法就是使用HTML5原生的download属性,例如:

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

如果纯粹利用HTML属性来实现文件的下载(而不是浏览器打开或浏览),对于动态内容,就无能为力。

例如,我们对页面进行分享的时候,希望分享图片是页面内容的实时截图,此时,这个图片就是动态的,纯HTML显然是无法满足我们的需求的,借助JS和其它一些HTML5特性,例如,将页面元素转换到canvas上,然后再转成图片进行下载。

但本文要介绍的下载不是图片的下载,而是文本信息的下载,所需要使用的HTML特性不是canvas,而是其它。

二、借助HTML5 Blob实现文本信息文件下载

原理其实很简单,我们可以将文本或者JS字符串信息借助Blob转换成二进制,然后,作为<a>元素的href属性,配合download属性,实现下载。
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>JS前端创建html或json文件并浏览器导出下载</title> <style>textarea {max-width: 600px;width: 100%;-ms-box-sizing: border-box;box-sizing: border-box;font-family: Consolas, "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", Monaco, "Courier New", monospace;}input[type="button"] {font-size: 100%;height: 36px;}</style></head><body><div class="demo"><textarea rows="11"><!DOCTYPE html><html><head><meta charset="utf-8"><title>测试</title></head><body><h1>测试</h1></body></html></textarea><p><input type="button" value="作为test.html文件下载"></p></div><script>var eleTextarea = document.querySelector('textarea');var eleButton = document.querySelector('input[type="button"]');// 下载文件方法var funDownload = function(content, filename) {var eleLink = document.createElement('a');eleLink.download = filename;eleLink.style.display = 'none';// 字符内容转变成blob地址var blob = new Blob([content]);eleLink.href = URL.createObjectURL(blob);// 触发点击document.body.appendChild(eleLink);eleLink.click();// 然后移除document.body.removeChild(eleLink);};if('download' in document.createElement('a')) {// 作为test.html文件下载eleButton.addEventListener('click', function() {funDownload(eleTextarea.value, 'test.html');});} else {eleButton.onclick = function() {alert('浏览器不支持');};}</script></body></html>

content 指需要下载的文本或字符串内容,filename指下载到系统中的文件名称,点击“下载”按钮,会把文本域中的内容全部作为一个.html后缀文件下载下来。

三、Blob对象

Blob 对象相当于一个容器,可以用于存放二进制数据。它有两个属性,size 属性表示字节长度,type 属性表示 MIME 类型。
如何创建:Blob 对象可以使用 Blob() 构造函数来创建

var blob = new Blob(['hello'], {type:"text/plain"});

Blob 构造函数中的第一个参数是一个数组,可以存放 ArrayBuffer对象、ArrayBufferView 对象、Blob对象和字符串。
Blob 对象可以通过 slice() 方法来返回一个新的 Blob 对象。

var newblob = blob.slice(0,5, {type:"text/plain"});

slice() 方法使用三个参数,均为可选。第一个参数代表要从Blob对象中的二进制数据的起始位置开始复制,第二个参数代表复制的结束位置,第三个参数为 Blob 对象的 MIME 类型。
canvas.toBlob() 也可以创建 Blob 对象。toBlob() 使用三个参数,第一个为回调函数,第二个为图片类型,默认为 image/png,第三个为图片质量,值在0到1之间。

var canvas = document.getElementById('canvas');canvas.toBlob(function(blob){ console.log(blob); }, "image/jpeg", 0.5);

下载文件
Blod 对象可以通过 window.URL 对象生成一个网络地址,结合 a 标签的 download 属性来实现下载文件功能。

比如把 canvas 下载为一个图片文件

var canvas = document.getElementById('canvas');canvas.toBlob(function(blob) {// 使用 createObjectURL 生成地址,格式为 blob:null/fd95b806-db11-4f98-b2ce-5eb16b38ba36var url = URL.createObjectURL(blob);var a = document.createElement('a');a.download = 'canvas';a.href = url; // 模拟a标签点击进行下载a.click(); // 下载后告诉浏览器不再需要保持这个文件的引用了URL.revokeObjectURL(url);});

四、结束语

不止是.html文件,.txt,.json等只要内容是文本的文件,都是可以利用这种小技巧实现下载的。

在Chrome浏览器下,模拟点击创建的<a>元素即使不append到页面中,也是可以触发下载的,但是在Firefox浏览器中却不行,因此,上面的funDownload ()方法有一个appengChild和removeChild的处理,就是为了兼容Firefox浏览器。

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

  1. 有没有办法为Node.js项目自动构建package.json文件

    本文翻译自:Is there a way to automatically build the package.json file for Node.js projects Is package.js ...

  2. 项目总结23:POI生成Excel文件并浏览器导出

    项目总结23:POI生成Excel文件并浏览器导出 具体的逻辑可以参考Controller层的注释 代码1-前端html <button onclick="downLoad()&quo ...

  3. js ajax的请求地址不正确,使用香草JS AJAX请求访问本地JSON文件时出现CORS错误?...

    我正在尝试使用香草JS AJAX请求从本地存储的JSON文件中拉回JSON字符串(特别是尝试不使用JQuery)-以下代码基于此答案 -但我在Chrome控制台中不断收到错误(见下文).有什么想法我要 ...

  4. 是否提交由npm 5创建的package-lock.json文件?

    本文翻译自:Do I commit the package-lock.json file created by npm 5? npm 5 was released today and one of t ...

  5. js 读取外部的本地json文件

    Javascript 读取外部的本地json文件 方案1运行本地web服务器,提供文件服务 方案2 1.data = '[{"name" : "Ashwin", ...

  6. JS 变量保存为本地json文件,读取本地json文件为变量

    一.变量保存为本地json文件: 第一步:把返回的数据转成json格式 var content = json.stringify(data); 第二步:把转成blob这种格式             ...

  7. Unity读取excel 数据 并创建对应的json文件

    https://download.csdn.net/download/jinxiul5/85188120 工具下载链接是 : https://download.csdn.net/download/ji ...

  8. 【小5聊】前端基础之上传图片等文件IE浏览器是会显示两个请求

    [IE浏览器请求两次] [排查分析] 1)经过排查,发现是type=file上传文件标签的change方法执行了两次 2)IE浏览器下会出现执行两次,Edge不会出现,其他浏览器未测试 3)最后分析发 ...

  9. 若依 springboot 使用freemarker生成word文件,并导出下载

    目录 freemarker生成word文件并导出 一.环境准备 二.编写代码 1.实体类 2.mapper.xml文件 3.mapper.java文件 4.Service.java 5.Service ...

最新文章

  1. 【新星计划】MATLAB绘制图形
  2. php7 变量,变量在PHP7内部的实现(一)
  3. 对搜狗输入法的个人评价
  4. groovy import java_在Java中调用Groovy方法的又一种方法:使用接口
  5. 基于GIS的视频管理指挥平台
  6. CANopen笔记1
  7. Python 制作微信全家福,你就是朋友圈最亮的仔!
  8. vue-cli3.0修改浏览器中的小图标
  9. 事件EVENT与waitforsingleobject的使用以及Mutex与Event的区别
  10. 信息学奥赛一本通(1104:计算书费)
  11. 您能解决这3个(看似)简单的Python问题吗?
  12. Under the Hoods of Cache Fusion, GES, GRD and GCS
  13. java day17 【线程、同步】
  14. 在 Mac App Store 上如何查看未完成的下载?
  15. 案例研究:FIT2CLOUD 飞致云携手联友科技助力东风日产云管平台建设
  16. win10你的设备遇到问题,需要重启的五种解决方法
  17. Unity3D 中动态更改材质球纹理
  18. 程序员也要学英语——印欧语音变规律总结
  19. AD16 绘制简单电路原理图的基本步骤(适合小白)
  20. 计算机网络课设-电子邮件客户端程序设计与实现(C/C++语言)

热门文章

  1. AJAX根据邮政编码,自动完成城市和地址信息
  2. 4月28日,邀您参加开鸿智谷教育在鸿OS发行版发布会
  3. 博图安装msi失败_博途V13 安装的时候出现一个 MSI File initialization failed:ERROR_INSTALL_FAILURE 请问是怎么回事啊?...
  4. 018基于JSP网上图书商城系统
  5. GB4793.1试验学习(二)
  6. javaweb知识点总结(黑马视频笔记)
  7. CentOS7 系统基础优化
  8. 集成阿里推送SDK中的问题:Duplicate zip entry UTDevice.class
  9. eclipse集成wtk,配置j2me
  10. Linux和网络常用面试题