纯JS生成并下载各种文本文件或图片

栏目: JavaScript · 发布时间: 7年前

内容简介:本文转载自:如果希望在前端侧直接触发某些资源的下载,最方便快捷的方法就是使用HTML5原生的具体介绍可参考我之前的文章:“

本文转载自: www.zhangxinxu.com/wordpress/?…

一、HTML与文件下载

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

<a href="large.jpg" download>下载</a>复制代码

具体介绍可参考我之前的文章:“ 了解HTML/HTML5中的download属性 ”。

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

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

但本文要介绍的下载不是图片的下载,而是文本信息的下载,所需要使用的HTML特性不是 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 指下载到系统中的文件名称。

万般言语不达意,一枚实例来走心。

您可以狠狠地点击这里: 基于funDownload实现的html格式文件下载demo

点击“下载”按钮,会把文本域中的内容全部作为一个 .html 后缀文件下载下来,各流程效果如下面几张图:

纯JS生成并下载各种文本文件或图片

出现下载确认框(根据浏览器的设置不同也可能直接下载),然后名称默认就是 test.html

纯JS生成并下载各种文本文件或图片

然后对应保存目录就多了个类似下图的文件:

纯JS生成并下载各种文本文件或图片

双击该 test.html 文件可以在浏览器中正常浏览,说明,保存信息无误。

纯JS生成并下载各种文本文件或图片

触发下载的JS代码就几行:

button.addEventListener('click', function () {
    funDownload(textarea.value, 'test.html');	
});复制代码

三、借助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图片,则canvas.toDataURL('image/png')
    eleLink.href = canvas.toDataURL('image/jpeg');
    // 触发点击
    document.body.appendChild(eleLink);
    eleLink.click();
    // 然后移除
    document.body.removeChild(eleLink);
};复制代码

四、结束语

不止是 .html 文件, .txt , .json 等文本文件都可以使用这种小技巧实现下载。

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

download 属性从Edge13开始支持,根据同行测试可以触发下载,不过生成的文件命名类似GUID,需要手动再加个后缀。

就这些,感谢阅读!

纯JS生成并下载各种文本文件或图片


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Practical JavaScript, DOM Scripting and Ajax Projects

Practical JavaScript, DOM Scripting and Ajax Projects

Frank Zammetti / Apress / April 16, 2007 / $44.99

http://www.amazon.com/exec/obidos/tg/detail/-/1590598164/ Book Description Practical JavaScript, DOM, and Ajax Projects is ideal for web developers already experienced in JavaScript who want to ......一起来看看 《Practical JavaScript, DOM Scripting and Ajax Projects》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具