1. 服务器设置附件响应头
这种方式会直接产生下载提示,用户选择了下载存放位置后就不需要管它了,表现为响应快
这样文件的下载会直接,不会有“点击下载还需要等待一端时间才会弹窗下载位置选择”的情况
'Content-Disposition': 'attachment; filename=example.png',
2. 客户端设置a标签download
无法设置请求头,如果是通过token验证是否合法,那么单纯的这种方式是不行的,如果是cookie验证或者不需要验证用户信息那么可以采用这种方式
**验证信息用的Token,**这种方式通常是应用在不需要携带登录信息的场景,如果需要登录信息(Token)就需要使用到xhr或者fetch,设置请求头,拿到文件流,构造本地URL然后通过a标签模拟点击下载。
另外,还可以单独的对下载接口设置cookie来验证,cookie在同源下可以默认携带。方法是发起一个请求,表示需要下载,然后服务端返回头包含Set-Cookie,此时点击a标签发起请求,会携带cookie。
3. AJAX获取文件流
拿到文件流,构造本地URL,赋值a标签src,模拟点击下载
4. 分片下载
分片下载,和分片上传类似,好处是可以断网后恢复继续下载(前端需要将之前已经下载的载本地保存起来,如保存在indexDB中),可以暂停下载等等
关键点是需要配置请求头 Range: [一个字节范围]
配置响应头Content-Range:[一个字节范围]
,这样每次下载拿到的就是配置的这个字节段,最后将所有拿到的字节端组合起来就是一个完整的文件。
另外还可以分两种模式:单线程下载、多线程下载
- 单线程下载:下载速度不会提升,但可以续传
- 多线程下载:额外增加了下载速度的优势
- HTTP1.1,最多可以6个并发请求(不同浏览器可能不同)
- HTTP2.0,最多并发请求没有限制,但也不是越多越好,请求越多开销也会增加,反而影响速度
以上简单描述下载方法有哪些,具体方式可以🔎。