js如何下载后台传过来的base64文件
一、<a>标签的作用
相信大部分人都知道<a>链接再简单不过了,跳转嘛,跳转到另外一个页面,这谁不知道。
当然这这是一部分, <a> 标签定义超链接,用于从一个页面链接到另一个页面。<a> 元素最重要的属性是 href 属性,它指定链接的目标。大家所熟知的一部分,
其实还有 如果将<a>链接加上download,那么一切都有点不一样了。
比如:<a href="https://www.baidu.com/img/baidu_jgylogo3.gif" download>下载 百度的图片</a>
<a href="https://www.baidu.com/img/baidu_jgylogo3.gif" download="牛逼.png">下载 百度的图片</a> /// 如果为download赋值,即相当于为下载文件命名
大家可以在编辑器里面试试。虽然它还是链接,但可点击这个链接,然后把一个资源下载下来,而不是再像以往用浏览器打开。
有了这个功能,我们就可以做一些事了。
二、new FileReader()
在做点特别的事前我们再来看看这个 api; new FileReader(),光看起来就像一个文件什么的东东对吧,其实它是一个下载文件的构造函数。将后台传过来的base64字符串转码成文件
那到底有什么用呢,你可能这样问,很明显了嘛,配合我们的 <a> 标签,不就是想下什么下载什么不。比如你想去个什么....网站(嘿嘿)
既然做下载我们就只关注它几个和文件下载有关的方法。
readAsBinaryString 将文件读取为二进制码
readAsDataURL 将文件读取为 DataURL (这也是例子程序中用到的方法)
readAsText [encoding] 将文件读取为文本
readAsText:该方法有两个参数,其中第二个参数是文本的编码方式,默认值为 UTF-8。这个方法非常容易理解,将文件以文本方式读取,读取的结果即是这个文本文件中的内容。
readAsBinaryString:该方法将文件读取为二进制字符串,通常我们将它传送到后端,后端可以通过这段字符串存储文件。
readAsDataURL:这是例子程序中用到的方法,该方法将文件读取为一段以 data: 开头的字符串,这段字符串的实质就是 Data URL,Data URL是一种将小文件直接嵌入文档的方案。这里的小文件通常是
指图像与 html 等格式的文件。
在常规 HTTP 响应中,Content-Disposition响应标头是指示内容是否预期在浏览器中内联显示的标题,即,作为网页或作为网页的一部分或作为附件下载并且本地保存。
在一个multipart/form-data正文中,HTTP Content-Disposition通用标题是一个标题,可以在多部分主体的子部分中使用,以提供有关它适用的字段的信息。子部分由标题中定义的边界分隔Content-Type。用于身体本身,Content-Disposition没有任何作用。(单纯是个名字而已,嫌麻烦可忽略,虽然会用到,但是不妨碍它没用....)
下面直接撸干货::
此处省略一万行代码,这样看起来像大牛.....haha
ajax请求后,记得返回需为 blob格式文件
ajax......then(res => {
let reader = new FileReader();
reader.readAsDataURL(res.bodyBlob); // 转换为base64,可以直接放入a标签href
reader.onload = function (e) {
// 转换完成,还记得我们上文的<a>标签吗,动态创建一个a标签用于下载
let a = document.createElement('a');
let fileName = '' ; //下载总得有个名字吧。
if (res.headers.map['Content-Disposition'] != null && res.headers.map['Content-Disposition'].length > 0) {
fileName = res.headers.map['Content-Disposition'][0];
} else if (res.headers.map['content-disposition'] != null && res.headers.map['content-disposition'].length > 0) {
fileName = res.headers.map['content-disposition'][0];
} else {
fileName = excel.xlsx;
}
fileName = fileName.substring(fileName.lastIndexOf(".")); // 一般从后台传过来的值我们都得修改的,截取想要的文件名,当然视情况而定,万一不用改呢
a.download = fileName; // 贴心的为 <a>标签的 download 赋个值 其实是这样了 <a download="fileName"> </a>
a.href = e.target.result; // 贴心的为 <a>标签的href 赋个值 其实是这样了 <a href="e.target.result" download="fileName"> </a> 是不是和上文一样,只需小手轻轻一按。
但是<a>里面没值找不到?没关系让浏览器来,先加到浏览器里
// $("body").append(a); // 修复firefox中无法触发click,如果firefox下载不了,我是没问题
document.querySelector("body").appendChild(a);
a.click(); /// 再
// $(a).remove(); 修复firefox中无法触发click,如果firefox下载不了,我是没问题
document.querySelector("body").removeChild(a); // 用完即抛弃,内存很小的
})
原创文章,转载请附链接
js如何下载后台传过来的base64文件的更多相关文章
- vue2.x 下载后台传过来的流文件(excel)后乱码问题
1.接口返回的流和头部: 2.下载流文件的代码 方法一:是用了插件 https://github.com/kennethjiang/js-file-download 方法二:是用了 blob 不管哪种 ...
- js如何解析后台传过来的json字符串
1.js如何解析后台传过来的json字符串? 注意:js是无法直接接收和使用json或者Php的数据,用的话会出现undefined,所以要转换一下. 方式一: var str = '{"r ...
- js ajax向后台传数组可以直接拼接传输
ajax向后台传数组是可以直接传的,写法如下 var ids = [ ]; $(dom1).each(function(){ ids.push($(this).val()); }); var use ...
- Thymleaf js直接获取后台传过来的对象或者对象的属性以及map
简单说明:第一次接触thymleaf模板,对于thymleaf在js中如何获取后台传递过来的值,真的挺简单的,记住就行了 代码: 后台代码: //传递一个org对象给jspublic String t ...
- vue下载后台传过来的乱码流的解决办法
后台返回的乱码流 解决办法: 请求方式用的是axios,主要加关键的 {responseType: 'blob'} axios封装 export function postDownload(url, ...
- js 转java后台传过来的list
var intIndex=0; arrList = new Array(); arrList = "${orderNumList}".replace('[','').replace ...
- C#FTP操作类含下载上传删除获取目录文件及子目录列表等等
ftp登陆格式 : ftp://[帐号]:[密码]@[IP]:[端口] ftp://用户名:密码@FTP服务器IP或域名:FTP命令端口/路径/文件名 直接上代码吧,根据需要选择函数,可根据业务自己 ...
- Js获取file上传控件的文件路径总结
总结一个获取file上传控件文件路径的方法 firefox由于保护机制只有文件名,不能获取完整路径. document.getElementById('file').onchange = functi ...
- vue.js如何根据后台返回来的图片url进行图片下载
最近在做一个前端vue.js对接的功能模块时,需要实现一个下载图片的功能,后台返回来的是一串图片url,试了很多种方法,发现点击下载时出来的效果都是跳着到一个新的图片网页,后来经过一番琢磨,终于解决了 ...
随机推荐
- mysql基础(库、表相关)
一. mysql支持的数据类型 1.1 mysql支持的数字类型: TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767 ...
- poj 3295
题目意思就是计算表达式的值,如果所有情况下表达式为真就输出“tautology”,否则输出“not”. p, q, r, s, and t,每个人有两种情况,综合起来一共有32种情况,枚举所有情况最后 ...
- 【TensorFlow】理解tf.nn.conv2d方法 ( 附代码详解注释 )
最近在研究学习TensorFlow,在做识别手写数字的demo时,遇到了tf.nn.conv2d这个方法,查阅了官网的API 发现讲得比较简略,还是没理解.google了一下,参考了网上一些朋友写得博 ...
- H3C 更新发送全部路由表浪费网络资源
- sci,ei,istp三大科技文献检索系统
印刷版(SCI) 双月刊 ,500种 联机版(SciSearch) 周更新 ,600种 光盘版(带文摘)(SCICDE) 月更新 ,500种(同印刷版) 网络版(SCIExpanded) 周更新 ,6 ...
- 机器学习——集成学习之Bagging
整理自: https://blog.csdn.net/woaidapaopao/article/details/77806273?locationnum=9&fps=1 随机森林 1.随机森林 ...
- 一道非常棘手的 Java 面试题:i++ 是线程安全的吗
转载自 一道非常棘手的 Java 面试题:i++ 是线程安全的吗 i++ 是线程安全的吗? 相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼.内心肯定还在质疑 ...
- 【t056】智力问答(multiset做法)
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 新年联欢会上,G.Sha负责组织智力问答节目.G.Sha建立了一个很大很大的超级题库,并衡量了每道题的 ...
- 元组&字典&函数基础
set: 类似dict, 是一组key的集合,不存储value 本质:无序和无重复元素的集合 创建: 创建set需要一个list或者tuple或者dict作为输入集合 重复元素在set中会自动被过滤 ...
- 布尔&list与条件循环语句与trutle
布尔值与空值 布尔值: 一个布尔值只有True.False两种值 空值: 是python里一个特殊的值,用None表示.None不能理解为0.因为0是有意义的,而None是一个特殊值. list(列表 ...