下载类型
目前业务上碰到有两种下载类型,一种是返回的是文件在服务器上的所处位置,另一种返回的是整个文件的编码后的数组。这两者下载方式略有区别,但是大同小异。
下载资源
静态资源
后台服务器有静态资源且是固定的文件名(GET方式下载文件)
1 | window.location.href="http://www.域名/template.xlsx(文件名)" |
写全了就是
1 | function download(fileName, link) { |
解释一下代码,看起来是临时创建了一个 <a/>
标签,之后给标签赋值一个 download
文件名,一个 href
表示连接地址。之后临时加到页面上,模拟一个点击事件,执行下载,完事之后销毁。
返回文件流
Base64 编码
简述一下 Base64 编码,因为 URL 只能传输字符,所以这种方式的编码能把所有字符编码成 可打印字符。
基本原理是,每三个字符一组,共 3*8=24 bits,分成四份,每份的 6bits 按照以下码值表转码。余下的位置用 =
占位
码值表
码值 | 字符 | 码值 | 字符 | 码值 | 字符 | 码值 | 字符 |
---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
举例
1 | J S c r i p t |
注:6bits 分组不够时用 0
补齐;转为base64后不是4的倍数用 =
补齐
最后,base64是一种编码方式,而不是一种压缩方式,由于它使用4个字符来表示3个字符,总体大小会比原来大。
下载
1 | axios.post(url, { |
上图是一种实现,区别是这里使用了 FileReader
来将一个 Uint8Array
包装成了一个可读取的文件(dataURL)
FileReader
顺便提一下 FileReader
。
对象方法
方法名 | 参数 | 描述 |
---|---|---|
abort | none | 中断读取 |
readAsBinaryString | file | 将文件读取为二进制码 |
readAsDataURL | file | 将文件读取为 DataURL |
readAsText | file, [encoding] | 将文件读取为文本 |
事件
事件 | 描述 |
---|---|
onabort | 中断时触发 |
onerror | 出错时触发 |
onload | 文件读取成功完成时触发 |
onloadend | 读取完成触发,无论成功或失败 |
onloadstart | 读取开始时触发 |
onprogress | 读取中 |
所以上面的就是
- 读取文件成一个url
- 在读取完成以后触发下载流程