js下载文件

HTML与文件下载

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

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

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

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

单只是完成图片的下载不能满足日常业务的需求,对于业务需求是远远不够的。

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

如果对Blob不了解,可以先看看张鑫旭的理解DOMString、Document、FormData、Blob、File、ArrayBuffer数据类型一文。

原理其实很简单,我们可以将文本或者JS字符串借助Blob转换成二进制,然后,作为a元素的href属性,配合download属性,实现下载。

代码也比较简单,如下示例(兼容Chrome和FireFox):

复制代码
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);
};
复制代码

其中,content指需要下载的文本或者字符串内容,filename指下载到系统中的文件名称。

借助Base64实现任一文件下载

对于非文本文件,也是可以直接JS触发下载的,例如,如果我们想下载一张图片,可以把这张图片转换成Base64格式,然后下载。

代码示例:

复制代码
var funDownload = function(domImg, filename){// 创建隐藏的可下载链接var eleLink = document.createElement('a');eleLink.download = filename;eleLink.style.display = 'none';// 图片base64地址var canvas = document.createElement('canvas');var context = canvas.getContext('2d');var width = domImg.natureWidth;var height = domImg.natureHeight;context.drawImage(domImg, 0, 0);// 如果是PNG图片,则context.toDataURL('image/png');eleLink.href = context.toDataURL('image/jpeg');// 触发点击document.body.appendChild(eleLink);eleLink.click();// 移除document.body.removeChild(eleLink);
};
复制代码

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

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

继续说实现在下CSV文件的方法

我们通过ajax从后端请求到的数据一般都是json格式,也就是说需要把json数据转成csv格式的数据,经过寻找终于找到了一个比较好用的json转csv的工具。

直接上示例代码:

复制代码
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>Download</title><link rel="stylesheet" href="">
</head>
<body><div class="demo"><p><input type="button" value="作为test.html文件下载"></p></div><script src="json2csv.js" type="text/javascript" charset="utf-8"></script><script type="text/javascript" charset="utf-8">// 示例数据var fields = ['car', 'price', 'color'];var myCars = [{"car": "Audi","price": 40000,"color": "blue"}, {"car": "BMW","price": 35000,"color": "black"}, {"car": "Porsche","price": 60000,"color": "green"}];// json数据转csv格式var csv = json2csv({ data: myCars, fields: fields });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(csv, 'test.csv');    });} else {eleButton.onclick = function () {alert('浏览器不支持');    };}</script>
</body>
</html>

 

转载于:https://www.cnblogs.com/haojf/p/9407183.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二十世纪的十大科学骗局

来源&#xff1a;扬子晚报一般来说科学本是最讲求真实性的&#xff0c;但近些年来所谓轰动一时的科学“成果”中&#xff0c;却颇多假冒伪劣产品。1、百慕大“死亡三角”在众多科学骗局中&#xff0c;“百慕大”传说是影响最大且流传最广的一例&#xff0c;但它的起因只是第二次…

html 文本框 初始化,Flutter 文本框初始化时显示默认值

刚开始作Flutter文本框时候&#xff0c;使用的是TextField。彷佛大多数状况下都没有问题。代码形式以下&#xff1a;htmlclass _FooState extends State {TextEditingController _controller;overridevoid initState() {super.initState();_controller new TextEditingControl…

request.getAttribute()的数据类型转换问题

request.getAttribute("")返回的是object类型 int amount (int)request.getAttribute("buyamount"); 这种的转换方式一直会报错&#xff0c;需要强制解封装&#xff1a; int amount Integer.parseInt(request.getAttribute("buyamount").toS…

02_常用正则表达式

一、校验数字的表达式 1 数字&#xff1a;^[0-9]*$2 n位的数字&#xff1a;^\d{n}$3 至少n位的数字&#xff1a;^\d{n,}$4 m-n位的数字&#xff1a;^\d{m,n}$5 零和非零开头的数字&#xff1a;^(0|[1-9][0-9]*)$6 非零开头的最多带两位小数的数字&#xff1a;^([1-9][0-9]*)(.[…

复杂性系统面临的难题

来源&#xff1a;人机与认知实验室1 什么是复杂性目前无法表述清楚在汉语中“复杂”一词的意思为“事物的种类、头绪等多而杂”。在《朗文当代英语词典》中&#xff0c;形容词complex被解释为&#xff1a;(1)难于理解、解释或处理&#xff0c;不清楚或不简单&#xff1b; (2)由…

MySQL优化(2)--------常用优化

前言 之前已经简单介绍了MySQL的优化步骤&#xff0c;那么接下来自然而是就是常用的SQL优化&#xff0c;比如inseer、group by等常用SQL的优化&#xff0c;会涉及SQL语句内部细节&#xff08;这正是我缺乏的&#xff09;。最后希望自己能记录完成的一套MySQL优化博文&#xff0…

码元,波特,速率,带宽

码元&#xff1a;一个固定时长的信号波形&#xff0c;代表不同离散数值的基本波形 1码元可以携带多个比特的信息量 例如&#xff1a;下图就称为二进制码元&#xff0c;因为只有两种状态&#xff0c;一种代表0状态&#xff0c;一种代表1状态 还有其他进制码元 时长称为码元宽…

大爆炸之前的宇宙是什么样子?|赠书

来源&#xff1a;科研圈宇宙蛋难题古代的创世神话往往表现出奇妙的独创性&#xff0c;但是追根究底&#xff0c;它们只有两个基本的选择&#xff1a;宇宙要么是在有限的时间以前被创造的&#xff0c;要么就是永恒存在的。以下是神圣的印度教经文《奥义书》中描述的场景&#xf…

js获取html样式属性,js怎么获取指定css属性的值?

js怎么获取指定css属性的值&#xff1f;下面本篇文章给大家介绍一下。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。js怎么获取指定css属性的值&#xff1f;1、通过dom.style.属性 来获取但是这种方法无法获取id、class里的属性例子:…

页面某个模块的文字内容是动态的,可能是几个字,也可能是一句话。然 后,希望文字少的时候居中显示,文字超过一行的时候居左显示。该如何实现?...

text-align属性只能在内联元素<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>Document</title> <style> .box { padding: 10px; background-color: #cd0000; text-align: center; width:…

奈氏准则,香农定理

失真 现实中的信道(带宽受限&#xff0c;有噪声&#xff0c;干扰)&#xff0c;导致一些信号发生问题 影响失真的因素&#xff1a; 码元传输速率&#xff08;越快&#xff0c;失真越严重&#xff09; 信号传输距离&#xff08;越远越严重&#xff09; 噪声干扰 传输媒体质…

IBM中国研究院被曝已全面关闭

来源&#xff1a;AI科技评论作者&#xff1a;青暮AI科技评论最新消息&#xff0c;网传IBM中国研究院&#xff08;IBM CRL&#xff09;已经全面关闭。AI科技评论求证圈内权威人士&#xff0c;其表示消息大概率属实。IBM研究院是IBM公司的一个&#xff08;研究&#xff09;部门&a…

库存商品表html源码,JSP+Servlet+数据库的方式完成一个简易的库存商品管理系统...

【实例简介】JSPServlet数据库的方式完成一个简易的库存商品管理系统【实例截图】【核心代码】f48fd612-281d-454e-97d3-20c8f775879f└── Product├── ProductManageSystem│ ├── src│ │ └── com│ │ └── qbsp│ │ ├── servlet│ │ │…

图形化安装配置:安装oracle、新建数据库、用plsql连接oracle,套路明白了其实挺简单...

1&#xff1a;安装oracle。 我的安装路径是c:\app&#xff0c;那oracle_home就是&#xff1a;C:\app\guestAdmin\product\11.2.0\dbhome_1。 装完后菜单在这里&#xff1a; 2&#xff1a;创建数据库his&#xff0c;注意&#xff1a;oracle的每个数据库&#xff0c;都是一个服务…

Leetcode--560. 和为K的子数组

给定一个整数数组和一个整数 k&#xff0c;你需要找到该数组中和为 k 的连续的子数组的个数。 示例 1 : 输入:nums [1,1,1], k 2 输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 说明 : 数组的长度为 [1, 20,000]。 数组中元素的范围是 [-1000, 1000] &#xff0c;且整数 k…

细数高光时刻,2020全球科技巨头如何激战AI?

来源&#xff1a;嵌入式资讯精选本文作者&#xff1a;Jiachang Pan编辑&#xff1a;SV Insight最近&#xff0c;百度、谷歌等多家科技巨头相继发布2020年AI发展总结。2020年12月30日&#xff0c;百度以一篇万字长文《百度AI的2020》向2020年告别。2021年1月12日&#xff0c;谷歌…

html表格ui,table表格 - 基础 - H-ui前端框架官方网站

表格系统默认表格表头表头表头类别表格内容表格内容类别表格内容表格内容类别表格内容表格内容....table H-ui默认表头表头表头类别表格内容表格内容类别表格内容表格内容类别表格内容表格内容....table-border 带水平线表头表头表头类别表格内容表格内容类别表格内容表格内容类…

PHP逐行解析文件,并写入数据库

$filePath为文件路径&#xff0c;上传文件则返回文件路径调用下面函数即可public function readText($filePath,&$errorCode,&$errorMessage){ try{ $file fopen($filePath, "r"); // 只读文件 if(empty($file)){ $errorCode …

数据编码信号调制

信道上传送的信号也可以分为&#xff1a; 基带信号&#xff1a;将数字信号1&#xff0c;0直接用两种不同的电压表示&#xff0c;再送到数字信道上去传输 直接表达了要输出的信息的信号。 基带信号在数字信道上去传输&#xff0c;就叫做基带传输 宽带信号&#xff1a;将基带…

人为什么要学数学 ——数学意义的哲学思考

来源&#xff1a;算法与数学之美编辑 ∑Gemini人为什么要学数学&#xff1f;其实很多人并不清楚&#xff0c;甚至存在许多认识误区&#xff0e;有学生认为&#xff0c;“数学除了买东西的时候有点用&#xff0c;考试的时候有点用&#xff0c;没有多大的实际用途&#xff0e;”还…