当前位置:首页 > 技术分析 > 正文内容

这是前端所有的下载方式了吧?(前端 下载)

ruisui885个月前 (01-24)技术分析21

本系列分为两篇,第一篇总结常用下载方式,不需要认证的文件或者需要认证的小文件下载。第二篇总结的是从需要认证的接口进行大文件下载的几种情况。(分篇依据是从建议使用的维度进行分类,理论上讲,需要认证的几种下载方式也可以进行不需要认证的文件下载)

1. 直接通过获取UrL,利用浏览器跳转页面进行下载(window.open或者模拟点击a标签)

这种方法适用于不需要认证,给我们文件地址就可以直接让浏览器代理下载的情况。但正常项目中的文件,很多需要进行POST请求,接口认证后才能进行文件下载,通常需要在header中添加认证信息,这就无法使用window.open的方式实现了,进而不得不采用流式获取的方式,在js中接收数据。

2. 流式获取,本地内存获取,然后转化为UrL进行下载(createObjectURL)

在需要认证的POST接口中,对于一些小文件,我们通常会先将文件流保存到内存中,等到文件流传输完成,再进行下载。代码如下:

// 使用axios的话
 ?this.$axios.post('http://localhost:3000/download',{
  },{
 ? ? ?responseType: 'blob'
  }).then(function(response) {
 ? ? ?const url = window.URL.createObjectURL(new Blob([response.data]));
 ? ? ?const a = document.createElement('a');
 ? ? ?a.href = url;
 ? ? ?a.download = 'helloworld.txt';
 ? ? ?a.click();
 ? ? ?window.URL.revokeObjectURL(url);
      a.remove();
  });

// 使用fetch的话
fetch("http://localhost:3000/download",{
 ? ?method: 'POST',
 ? ?responseType: 'blob'
}).then(res => {
 ? ?return res.blob()
}).then(res => {
 ? ?const blob=new Blob([res])
 ? ?const url = window.URL.createObjectURL(blob);
 ? ?const a = document.createElement('a');
 ? ?a.href = url;
 ? ?a.download = 'helloworld.txt';
 ? ?a.click();
 ? ?window.URL.revokeObjectURL(url);
    a.remove();
})

开发过程中遇到两个小知识点

  1. revokeObjectURL这个方式是用来告知浏览器,通过createObjectURL创建的对象已经可以被清除了。虽然通过垃圾回收机制也可清除,但这个效率更高。
  2. 使用fetch的时候,fetch有一个很迷惑的配置,mode: 'no-cors',注意使用这个配置的话,他并不是用来解决跨域问题的,如果接口跨域,使用了这个配置,虽然能访问通,但是不会返回任何数据,换句话说,他只能检测接口连通性。

3. 流式获取,通过form进行下载

在不需要header中添加认证的POST请求中,也可以采用form的方式进行下载(比如使用的是cookie认证),他的好处就是下载的时候不会占用js主线程,下载过程中不会导致页面卡顿。当然form也可以直接进行get请求的流式下载(理论上讲,能请求浏览器,就能进行get下载,iframe,form都可以),但这就有点多此一举了,get请求可以直接参考方法1进行下载,省时省力。下面看下如何使用form进行post请求的流式下载。

const form = document.createElement('form')
form.action = "http://localhost:3000/download"
form.target = "_self"
form.method = "post"
form.style.display = "none"
document.body.appendChild(form)
form.submit()
form.remove()

需要注意的是,不管是iframe还是form,进行流式下载的时候,需要服务端在header中添加'Content-Disposition': 'attachment; filename=customfilename.txt'配置进行强制文件下载,否则会被浏览器当做页面直接进行展示。

以上3个方法常用在不需要认证的下载或者小文件下载。需要认证的大文件下载,请查看总结二。


文章转自:
https://juejin.cn/post/7363200136975712297

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/514.html

分享给朋友:

“这是前端所有的下载方式了吧?(前端 下载)” 的相关文章

发行版Vanilla OS 2发布稳定版:彻底重写、改变使用Linux的方式

Vanilla OS 是去年崭露头角的 Linux 发行版,最初的 1.0 版本基于 Ubuntu 构建 —— 亮点之一是系统核心“不可变”。后来改用 Debian 测试分支 (Debian Sid),免费且开源,默认桌面环境是 GNOME。什么是不可变 Linux 发行版?不可变发行版确保操作系统...

Gitlab之间进行同步备份

目前,我们公司有两个研发团队,分别在北京和武汉,考虑到访问速度的问题,原有武汉的研发环境在近端部署。也就是北京和武汉分别有两套独立的研发管理环境,虽然这解决了近端访问速度的问题,但是管理上较为分散,比如研发环境备份和恢复就是最重要的问题之一。最近,处于对安全性和合规性的考虑,希望将北京和武汉的源代码...

学前端,这30个CSS选择器,你必须熟记

你学会了基本的id,class类选择器和descendant后代选择器,然后就觉得完事了吗?如果这样,你就会错过许多灵活运用CSS的机会。虽然本文提到的许多选择器都属于CSS3,并且只能在现代的浏览器中使用,但学会这些是大有好处的。什么是CSS选择器呢?每一条css样式定义由两部分组成,形式如下:[...

VUE 技术栈

官网链接:https://cn.vuejs.org/什么是vue:渐进式JavaScript 框架vue-cli链接:https://cli.vuejs.org/vue-cli安装:npm install -g @vue/clivue -V创建一个项目:vue create xxxxxx模版语法:文...

uni-app基于vue开发小程序与标准vue开发新增点

1、路由跳转传参uni.navigateTo({ url: `/pages/transition/spreadTextAction?t=${this.options.t}&rt=${this.options.rt}&l=${this.options.l}`});uni.navigateBack({...

SpringCloudalibaba+Vue开发仿社交小程序-青牛白马七香车

Spring Cloud Alibaba和Vue是当今开发领域中最为流行的技术组合之一。本文将介绍如何使用Spring Cloud Alibaba和Vue开发仿社交小程序。download: https://www.97yrbl.com/t-1632.html项目概述本项目是一个仿社交小程序,包括用...