一、<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文件的更多相关文章

  1. vue2.x 下载后台传过来的流文件(excel)后乱码问题

    1.接口返回的流和头部: 2.下载流文件的代码 方法一:是用了插件 https://github.com/kennethjiang/js-file-download 方法二:是用了 blob 不管哪种 ...

  2. js如何解析后台传过来的json字符串

    1.js如何解析后台传过来的json字符串? 注意:js是无法直接接收和使用json或者Php的数据,用的话会出现undefined,所以要转换一下. 方式一: var str = '{"r ...

  3. js ajax向后台传数组可以直接拼接传输

    ajax向后台传数组是可以直接传的,写法如下 var ids = [ ]; $(dom1).each(function(){ ids.push($(this).val()); }); var  use ...

  4. Thymleaf js直接获取后台传过来的对象或者对象的属性以及map

    简单说明:第一次接触thymleaf模板,对于thymleaf在js中如何获取后台传递过来的值,真的挺简单的,记住就行了 代码: 后台代码: //传递一个org对象给jspublic String t ...

  5. vue下载后台传过来的乱码流的解决办法

    后台返回的乱码流 解决办法: 请求方式用的是axios,主要加关键的 {responseType: 'blob'} axios封装 export function postDownload(url, ...

  6. js 转java后台传过来的list

    var intIndex=0; arrList = new Array(); arrList = "${orderNumList}".replace('[','').replace ...

  7. C#FTP操作类含下载上传删除获取目录文件及子目录列表等等

    ftp登陆格式  : ftp://[帐号]:[密码]@[IP]:[端口] ftp://用户名:密码@FTP服务器IP或域名:FTP命令端口/路径/文件名 直接上代码吧,根据需要选择函数,可根据业务自己 ...

  8. Js获取file上传控件的文件路径总结

    总结一个获取file上传控件文件路径的方法 firefox由于保护机制只有文件名,不能获取完整路径. document.getElementById('file').onchange = functi ...

  9. vue.js如何根据后台返回来的图片url进行图片下载

    最近在做一个前端vue.js对接的功能模块时,需要实现一个下载图片的功能,后台返回来的是一串图片url,试了很多种方法,发现点击下载时出来的效果都是跳着到一个新的图片网页,后来经过一番琢磨,终于解决了 ...

随机推荐

  1. 关于top命令

    top命令交互操作指令 下面列出一些常用的 top命令操作指令 q:退出top命令 :立即刷新 s:设置刷新时间间隔 c:显示命令完全模式 t::显示或隐藏进程和CPU状态信息 m:显示或隐藏内存状态 ...

  2. VisualStudio 使用多个环境进行调试

    在 VisualStudio 2017 支持使用 launchSettings.json 文件定义多个不同的环境进行调试 先给大家一张图看一下效果 可以看到原来的是启动的按钮,现在被我修改为 lind ...

  3. Python--day32--复习:https和http的区别;黏包;黏包问题的解决方式;

    1,https和http的区别: https比较安全,传输的时候先对内容进行加密,收到后再进行解密:它的传输内容不容易拦截,就算拦截下来了,也是加密的,看不懂.但是要买证书,一年要好几万,小公司承担不 ...

  4. Error与Exception的区别,Java常见异常Execption总结

    错误和异常的区别(Error vs Exception) 错误和异常的区别(Error vs Exception) 今天面试问了这样一个问题,"Error" 和 "Exc ...

  5. background:url(./images.png) no-repeat 0 center的用法

    background:url(./images.png) no-repeat 0 center; //图像地址 不重复 水平位置0 垂直位置居中 background:url(./images.png ...

  6. ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统(6)

    快过年了,公司事情忙,好几天没有继续写博客,今天开始写账户模块系统登录,账户管理以及登录日志, 首先新建登录日志数据表: USE [MVCSystem] GO /****** Object: Tabl ...

  7. dll中全局变量在外部进行引用

    在Windows中实际导出全局变量,您必须使用类似于export / import语法的语法,例如: #ifdef COMPILING_THE_DLL #define MY_DLL_EXPORT ex ...

  8. Java并发机制的底层实现原理之volatile应用,初学者误看!

    volatile的介绍: Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现 ...

  9. jenkins+Git+Gitlab+Ansible实现持续集成自动化部署静态网站(二)

    引言:首先我们可以实现一键部署网站,但在实际生产环境网站部署完成之后,我们的开发隔三差五要修改下网站的内容,难道都要我们运维手动执行命令吗?没有一种方法使得开发人员修改完代码自己测试,部署上线呢,那这 ...

  10. UE4 C++ 代码编译方式

    Unreal 有一个非常酷的特性 —> 不必关闭编辑器就可以编译 C++ 更改! 有两种方法可以达到这个目的: 1.直接点击编辑器主工具栏中的 编译(Compile) 按钮. 2.在编辑器继续运 ...