js下载文件

下载类型

目前业务上碰到有两种下载类型,一种是返回的是文件在服务器上的所处位置,另一种返回的是整个文件的编码后的数组。这两者下载方式略有区别,但是大同小异。


下载资源

静态资源

后台服务器有静态资源且是固定的文件名(GET方式下载文件)

window.location.href="http://www.域名/template.xlsx(文件名)"

写全了就是

function download(fileName, link) {
    let a = document.createElement('a');
    a.download = fileName;
    a.href = link;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);   
}

解释一下代码,看起来是临时创建了一个 <a/> 标签,之后给标签赋值一个 download 文件名,一个 href 表示连接地址。之后临时加到页面上,模拟一个点击事件,执行下载,完事之后销毁。


返回文件流

Base64 编码

简述一下 Base64 编码,因为 URL 只能传输字符,所以这种方式的编码能把所有字符编码成 可打印字符

基本原理是,每三个字符一组,共 3*8=24 bits,分成四份,每份的 6bits 按照以下码值表转码。余下的位置用 = 占位

码值表
码值字符码值字符码值字符码值字符
0A16Q32g48w
1B17R33h49x
2C18S34i50y
3D19T35j51z
4E20U36k520
5F21V37l531
6G22W38m542
7H23X39n553
8I24Y40o564
9J25Z41p575
10K26a42q586
11L27b43r597
12M28c44s608
13N29d45t619
14O30e46u62+
15P31f47v63/
举例
        J         S         c          r         i         p          t
Ascii   74        83        99         114       105       112        116
bin     01001010  01010011  01100011   01110010  01101001  01110000   01110100
6bits   010010 100101  001101 100011   011100 100110  100101 110000   011101 00 0000 
dec     18     37      13     35       28     38      37     48       29     0
base64  S      l       N      j        c      m       l      w        d      A
result  SlNjcmlwdA==

注:6bits 分组不够时用 0 补齐;转为base64后不是4的倍数用 = 补齐

最后,base64是一种编码方式,而不是一种压缩方式,由于它使用4个字符来表示3个字符,总体大小会比原来大。


下载
axios.post(url, {
        params
    }, {
    	responseType: 'blob'
    })
    .then(function(res) {
        var blob = res.data;
        // FileReader主要用于将文件内容读入内存
        var reader = new FileReader();
        reader.readAsDataURL(blob);
        // onload当读取操作成功完成时回调
        reader.onload = function(e) {
        	var a = document.createElement('a');
            // 获取文件名fileName
            var fileName = res.headers["content-disposition"].split("=");
            fileName = fileName[fileName.length - 1];
            fileName = fileName.replace(/"/g, "");
            a.download = fileName;
            a.href = e.target.result;
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
		}
	}
);

请添加图片描述

上图是一种实现,区别是这里使用了 FileReader 来将一个 Uint8Array 包装成了一个可读取的文件(dataURL)


FileReader

顺便提一下 FileReader

对象方法

方法名参数描述
abortnone中断读取
readAsBinaryStringfile将文件读取为二进制码
readAsDataURLfile将文件读取为 DataURL
readAsTextfile, [encoding]将文件读取为文本

事件

事件描述
onabort中断时触发
onerror出错时触发
onload文件读取成功完成时触发
onloadend读取完成触发,无论成功或失败
onloadstart读取开始时触发
onprogress读取中

所以上面的就是

  • 读取文件成一个url
  • 在读取完成以后触发下载流程

欢迎来我的博客做客
zhyib.gitee.io
zhyib.github.io

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值