js下载文件的实现方式

时间:?2021-10-14阅读:?14标签:?文件

一,普通下载

当后端返回的资源是链接时,此时可以使用 a 标签或者 window.var tt直接打开。

1,a 标签形式

在H5中,a标签新增了download 属性,包含该属性的链接被点击时,浏览器会以下载文件方式下载 href 属性上的链接。

 <a href="#" download="example.html">下载</a>

// 或者封装
function download(href, title) {
    const a = document.createElement('a');
    a.setAttribute('href', href);
    a.setAttribute('download', title);
    a.click();
}
download('https://example.com', 'test')

2,var tt.href 直接打开

window.location.href === 'https://example.com'


二,流文件下载

当后端返回的文件是流文件时,以 umi-request 请求方法为例

首先应在请求中设置返回类型:responseType: "blob"

import request from "umi-request";

export const downLoad = (url, fileName) =>
  request(url, {
    method: "POST",
    data: data,
    responseType: "blob", // 代表内存之中的一段为二进制
  }).then(data) => {
    const blob = data;
    let link = document.createElement("a");
    link.href = URL.createObjectURL( new Blob([blob], { type: "application/vnd.ms-excel" }) );
    link.download = fileName;
    document.body.appendChild(link);
    link.click();
    URL.revokeObjectURL(link.href);
};

1,自定义文件名

此时可以发现后端返回的是流文件,旺球体育在线接到的是乱码。当旺球体育在线自定义文件名时,可以直接下载

downLoad('https://example.com/api/download', 'test.xlsx')

2,采用后端定义的文件名

当采用后端的fileName时,此时要获取后端在 content-disposition 中定义的文件名。

首先调用接口,发现文件名是在请求头content-disposition 中,需要注意的是:虽然我们能看到,但是却拿不到请求头。

如果想让浏览器能访问到其他响应头的话,需要后端在服务器上设置 Access-Control-Expose-Headers

// 后端面大致写法
headers.add("Access-Control-Expose-Headers", "Content-Disposition"); 

此时可以拿到相关信息,发现是编码的,需要decodeURI 进行解码

const disposition = response.headers.get('Content-Disposition');

const fileName = decodeURI(disposition.split(";")[1].split("filename=")[1])
注:直接在请求方法里是不能获取到请求头信息的,需要对请求进行拦截
request.interceptors.response.use(async (response) => {
  const disposition = response.headers.get("Content-Disposition"); // 获取Content-Disposition
  return disposition // 当Content-Disposition中有值的时候进行处理,其他请求的响应则放过
    ? {
        blob: await response.blob(), // 将二进制的数据转为blob对象,这一步是异步的因此使用async/await
        fileName: decodeURI(disposition.split(";")[1].split("filename=")[1]), // 处理Content-Disposition,获取header中的文件名
      }
    : response;
});

完整的代码如下:

request 文件

import request from "umi-request";

// 响应拦截
request.interceptors.response.use(async (response) => {
  const disposition = response.headers.get("Content-Disposition"); // 获取Content-Disposition
  return disposition // 当Content-Disposition中有值的时候进行处理,其他请求的响应则放过
    ? {
        blob: await response.blob(), // 将二进制的数据转为blob对象,这一步是异步的因此使用async/await
        fileName: decodeURI(disposition.split(";")[1].split("filename=")[1]), // 处理Content-Disposition,获取header中的文件名
      }
    : response;
});

export const downLoadExcel = (url) =>
  request(url, {
    method: "POST",
    data: data,
    // responseType: "blob", // 注释掉这一段
  }).then(data => {
    const { blob, fileName } = response;
    let link = document.createElement("a");
    link.href = URL.createObjectURL( new Blob([blob], { type: "application/vnd.ms-excel" }) );
    link.download = fileName;
    document.body.appendChild(link);
    link.click();
    URL.revokeObjectURL(link.href);
    document.body.removeChild(link);
});

react 文件

<Buttton onClick={download}> 下载 </Button>

js 文件

async download() {
   await downLoadExcel('http://example.com/api/download');
},

原文来自:https://segmentfault.com/a/1190000040808084

站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: http://www.pannellisolari.net/article/detial/10731

html5:FileAPI 文件操作实战

HTML5 为我们提供了 File API 相关规范。主要涉及 File 接口 和 FileReader 对象 。本文整理了兼容性检测,文件选择,属性读取,文件读取,进度监控,大文件分片上传以及拖拽上传等开发中常见的旺球体育在线文件操作。

解决nginx和php使用ckfinder无法上传大文件的问题

cms内容发布系统上传不了大文件,当上传超过32M文件时就上传不了,提示:无效的文件. 文件尺寸太大。分析文件上传过程:browser --> nginx --> php ,需要修改 nginx.conf和php.ini

旺球体育在线实现文件在线预览txt,pdf,doc,xls,ppt几种格式

做法就是使用iframe标签,只需要配置src就可以,根据文件后缀判断如果是office的类型就在url前加上https://view.officeapps.live.com/op/view.aspx?src=

node.js 中的fs.rename()模块

node.js的核心模块 原生模块。修改文件名称,可更改文件的存放路径,方法说明 : 修改文件名称,可更改文件的存放路径.

js下载文件,判断文件是否返回

下载之前用的window.location.href下载的,但是这个判别不了文件是否返回,小文件倒还好,大的文件长时间没有下载也没有加载条什么的,用户有时会点击下载好几下,大的数据很容易将服务拖垮

JavaScript 中如何实现大文件并行下载

相信有些小伙伴已经了解大文件上传的解决方案,在上传大文件时,为了提高上传的效率,我们一般会使用 Blob.slice 方法对大文件按照指定的大小进行切割,然后在开启多线程进行分块上传,等所有分块都成功上传后

分析 gulp 的运作方式

vinyl 是 gulp 所使用的虚拟的文件格式,在它的自述文件是这么说的:“当提到文件时你首先想到的是什么?肯定是路径和内容吧”,它主要记录的信息有:path:文件路径,contents:文件内容

nodejs对项目下所有空文件夹创建gitkeep

项目/框架初始化时可能需要保留一些空文件,这时候就需要批量新增gitkeep

PHP下载大文件失败,并限制下载速度

PHP在使用readfile函数定义下载文件时候,文件不可以过大,否则会下载失败,文件损坏且不报错;这个是因为readfile读取文件的时候会把文件放入缓存,导致内存溢出;解决:分段下载,并限制下载速度;

血淋淋的事实告诉你:你为什么不应该在JS文件中保存敏感信息

在JavaScript文件中存储敏感数据,不仅是一种错误的实践方式,而且还是一种非常危险的行为,长期以来大家都知道这一点。

点击更多...

内容以共享,参考,研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

Baidu