Data URLs

Data URLs: 即前缀为data: 协议的URL,其允许内容创建者向文档中嵌入小文件。

  例如:可以直接在HTML中的img元素直接使用Data URLs ;

data:[<mediatype>][;base64],<data>
  • mediatype: 是个 MIME 类型的字符串,例如 "image/jpeg" 表示 JPEG 图像文件,'text/plain' 则表示txt文件,"excel/plain" 则表示excel文件;如果被省略,则默认值为 text/plain;charset=US-ASCII。
  • base64:即是base64编码,如果data是文本格式,可以直接嵌入文本。如下:
data:,Hello%2C%20World!  // text/plain 类型数据
data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D  // base64 编码版本

  如果是二进制数据,可以进行base64编码之后再进行嵌入。在JavaScript中,有两个函数btoa()、atob()分别用于解码和编码base64字符串。

Blob

Blob 对象表示一个不可变、原始数据的类文件对象,其中Blob.size代表对象中所包含数据的大小(字节),Blob.type 表明该Blob对象所包含数据的 MIME 类型。

  其方法主要是blob.arrayBuffer()返回一个promise且包含blob所有内容的二进制格式的ArrayBuffer。

// 可以直接创建一个简单的文本Blob对象
new Blob(["hello world"]) 
// 一个包含DOMString的数组,然后创建一个HTML类型的Blob对象
new Blob(["hello world".bold()], {type : 'text/html'});

  了解了上面的概念之后,步入正题

  1. 最简单的方式,比如下载图片,可以让后端以附件的形式下载,加以下面代码downloadSimple()方法,就可以下载图片文件了。

  downloadSimple(url: string, fileName: string) {
 const anchor = document.createElement('a');
const fileName = fileName || 'download';
if ('download' in anchor) { //html5 A[download]
anchor.href = url;
anchor.setAttribute("download", fileName);
anchor.className = "download-js-link";
anchor.innerHTML = "downloading...";
anchor.style.display = "none";
document.body.appendChild(anchor);
setTimeout(function () {
anchor.click();
document.body.removeChild(anchor);
}, 66);
return true;
}
 }

  2.GET请求下载,且responseType为blob。代码如下:(Get方法长度限制最大不要超过2048,即2048+35。这里要解释一下,其实get方法并没有限制URL最大长度限制,是浏览器的限制要求,而这个2083就是IE浏览器限制的最大长度,也是各个浏览器当中最小)。

 if (url && url.length < 2048) {
fileName = url.split("/").pop().split("?")[0];
anchor.href = url;
if (anchor.href.indexOf(url) !== -1) {
var ajax = new XMLHttpRequest();
ajax.open("GET", url, true);
ajax.responseType = 'blob';
ajax.onload = function (e:any) {
_this.downloadSimple(e.target.response, fileName); // 调用上面的a标签式下载方法
};
setTimeout(function () { ajax.send(); }, 0);
return ajax;
}
}

  3.POST方式下载,且后端返回base64编码格式的数据流,类似于这种(ZtjuPPe2d+GefPrD1RpnS6MGdJkebn4/+oMSAAOw==),然后可以拼接成Data URLs格式,用以上的代码段downloadSimple()就可以直接下载文件,如果是下载excel文件,则Data URLs的参数mediatype为"excel/plain" 。

  但是如果是IE浏览器用这种代码不行,可以用navigator.msSaveBlob()方法下载一个Blob 对象。首先需要把Data URLs转换成可供浏览器下载的Blob 对象。方法如下:

  

    function dataUrlToBlob(strUrl: string) {
var parts = strUrl.split(/[:;,]/),
type = parts[1],
decoder = parts[2] == "base64" ? atob : decodeURIComponent,
binData = decoder(parts.pop()),
mx = binData.length,
i = 0,
uiArr = new Uint8Array(mx); for (i; i < mx; ++i) uiArr[i] = binData.charCodeAt(i); return new myBlob([uiArr], { type: type });
}
  navigator.msSaveBlob(dataUrlToBlob(url));

前端JS下载文件总结的更多相关文章

  1. 小谢第10问:前端JS下载文件、表格

    对于小型文件及表格下载,一般采用a标签形式 <buttonb @click="downloadTemplate()">模板下载</button> downl ...

  2. 10.用js下载文件(需要后端链接)

          用js下载文件 PS:本文说的,并非如何用js创建流.创建文件.实现下载功能. 而是说的:你已知一个下载文件的后端接口,前端如何请求该接口,实现点击按钮.下载文件到本地.(可以是zip啦. ...

  3. ajax下载,前端js下载(转)

    前面一直做过下载的功能.就是后台将文件流写入response里面,然后就好了.前台会自动弹出下载提示等. 今天打算做一个ajax下载.想当然的结果死活浏览器没反应.我擦. 然后浏览器调试,发现resp ...

  4. 前端js,css文件合并三种方式,bat命令

    前端js,css文件合并三种方式,bat命令 前端js文件该如何合并三个方式如下:1. 一个大文件,所有js合并成一个大文件,所有页面都引用它.2. 各个页面大文件,各自页面合并生成自己所需js的大文 ...

  5. 使用js下载文件

    使用Echarts地图时,需要一些地图数据,到Echarts下载地图数据文件时,发现其下载是直接通过js下载,从其网站上扒下来的记录于此 FileSave.min.js网络地址:http://ecom ...

  6. Js下载文件到本地(兼容多浏览器)

    在客户端通过js下载文件,试过几种下载方式,iframe方式仅限于IE浏览器,window.open(url),location.href=url 这两种方式在chrome浏览器还会是直接打开文件而不 ...

  7. 两种 js下载文件的步骤

    ----------------------------------引用地址链接------------------------------------------------- http://www ...

  8. OSS阿里云上传文件 前端js下载url跨域问题

    场景: 1.后端上传文件至阿里云OSS,返回得到一个URL. 2.前端用这个URL下载文件,ajax请求异常:No 'Access-Control-Allow-Origin' header is pr ...

  9. Web前端js下载流文件

    前端下载文件大概有以下种: 1)a标签链接下载 <a href="url">点击链接下载</a> 2)表单form提交下载 var form = $(&qu ...

随机推荐

  1. Business Partner - 供应商与客户的集成 - S/4HANA(2)

    配置 BP配置 激活BP的PPO请求 Cross-Application Components->Master Data Synchronization->Master Data Sync ...

  2. Java 悲观锁 synchronized (member){代码块}

    Java 如果遇到会出现高并发的情况,一般建议使用悲观锁 :synchronized (member){代码块}  需要对数据库进行修改或新增的时候,建议写上事务--@Transactional @T ...

  3. 趣谈多线程(Python版)

    温馨提示:本文篇幅较长,建议读者耐心阅读,本文中的代码经过笔者精心构思,可以复制过去运行一下,观察输出结果,所有代码在python3.5.0中测试通过. 文章目录 What is 多线程? Why w ...

  4. 纯JS自定义网页滚动条

    前言 由于最近在公司很忙,没什么时间更新,忙中抽时间做了一个JS滚动条,因为火狐浏览器与谷歌浏览器的滚动条自定义样式过于麻烦,所以我打算自己写个方便改样式的滚动条 CSS <style> ...

  5. 联赛模拟测试20 C. Weed

    题目描述 \(duyege\) 的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,\(duyege\) 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在 ...

  6. linux ssh自动输入密码,expect使用

    想搞一个使用ssh登录批量ip地址执行命令,自动输入密码的脚本,但是ssh不能使用标准输入来实现自动输入密码,于是了解到了expect这个可以交互的命令 是什么 查看使用man查看expect,是这么 ...

  7. poco对象生成的几种方式根据你使用不同的ui决定

    androidpoco定义方法 from poco.drivers.android.uiautomation import AndroidUiautomationPoco dev = connect_ ...

  8. STM32入门系列-STM32时钟系统,STM32时钟树

    时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行.时钟系统犹如人的心脏,一旦有问题整个系统就崩溃.我们知道STM32属于高级单片机,其内部有很多的外设,但不是 ...

  9. 专题五:redis的数据类型之set

    一.基本简介 现在出现了新的查询需求:存储大量数据的同时,还需要在查询方面提供更高的效率.虽然list满足存储大量的数据,也可以通过索引来进行访问,但是list底层是双向链表的结构,在查询上的效率并没 ...

  10. 【转】not found while looking for property错误

    原址:http://blog.csdn.net/y3wegy/article/details/7840813 最近在研究Hibernate.过程当中碰到了很多问题啊!其中一个就是not found w ...